2009-05-18 11 views
2

C++プログラマであるため、C#で作業するたびにフリースタンディング関数のサポートが不足しているのだろうかと思います。つまり、どのクラスにも属さない関数です。スタンドアロン機能では完全なプライベートアクセスを必要とせずにクラスに機能を追加できるので、この機能は本当に欠けています。メンテナンスが難しいモノリスクラスを避けることができます。さらに、サードパーティのライブラリを拡張することもできます。私はあなたが静的なクラスを使用することができますが、クラス名は完全に無関係であり、クライアントコードを不必要に冗長にしています。C#のフリースタンディング関数

たとえば、私は、文字列の単語を数えるヘルパー関数を作成したい。どうすれば "StringHelperClass.CountWords();"を書く必要がなくなりますか?クライアントコードで? StringHelperClassは名前空間として機能しますが、「StringHelperClassを使用して」書き込むことはできません。私はすべての使用法で "StringHelperClass"を繰り返す必要がありますが、唯一のパラメータは文字列であるため、文字列ヘルパー関数であることは明らかです。

クライアントコードを簡潔にしながら、クラスの機能を拡張する方法はありますか?

+0

ええ、私はここに質問の証拠はありません。 – Noldorin

+1

私は「本当の質問ではない」と投票しました。 –

+0

クラス外のメソッドがオブジェクト指向言語でどのような意味を持ちますか? – annakata

答えて

2

私はそれがC#で欠けていると感じる機能であることに同意します。主な理由は、関数を使用することの冗長さです。クラス名は名前空間として機能しますが、コードファイルの先頭にその名前空間を単に使用する方法はありません。たとえば、C#でOpenGLを作成する場合は、次のように入力する必要があります。OpenGL.glClearDepth(1.0f); OpenGL.glEnable(GL_DEPTH_TEST);など私はそれはおそらくすべてのクラスを作るという基本的な概念とは関係があることを知っていますが、私は本当にあなたが事を特定のやり方でやり遂げるようにする言語は嫌いです。もちろん、私は他の選択肢がない限り(仕事のような)C#を実際に使用していないのかもしれません。

+1

おそらく、それらのメソッド名は冗長性を持っています - 単にOpenGL.ClearDepth(1.0f);でもかまいません - もちろん、本当にあなたがエイリアス宣言を使用したいなら、 'GL.ClearDepth (1.0f) ' - まだ私が言及したすべての利点を持っている(あなたが"。 "攻撃を見つけない限り)。 –

11

「なぜそれを含める必要がありますか?」

フリースタンディング機能を持たずにC#をまとめると、それらを追加する要件は何ですか?特に、静的ユーティリティクラスは、(正規または拡張メソッドのいずれかとして)ホスティングに適しており、競合が発生したときに単純な曖昧さ回避を可能にします。

また、(OregonGhostはコメントで指摘したように)だから、死バイのIntelliSenseなど

を防止し、コードをモジュール化に役立ちます:なぜそれらを追加しますか?まだ解決されていない問題(C#で)は何ですか?

+3

それは本当です。 IMOの静的ユーティリティクラスは実際にコードに価値を追加します。なぜなら、コードをモジュール化する必要があるからです。それは常に良いことです。もちろん、これは誤用される可能性がありますが、フリーフローティング機能でも同様です。 ああ、拡張メソッドは物事をさらに良くする。たとえば、文字列関数を文字列クラスに追加できるときにフリーフローティングにする必要があるのはなぜですか? :) – OregonGhost