2013-05-23 17 views
16

私はこれがフレームワーク設計の問題であると思います。私は最近、なぜSystem.Arrayのメソッドのほとんどが静的であるのかと疑問に思った。私の腸の反応は、常に、例えば、 Arrayインスタンス上のIndexOf(オブジェクト)。System.Array.IndexOf(配列、オブジェクト)ではありません。メソッドを静的にするかどうかにかかわらず、決定の背後にある主な原則はありますか?なぜSystem.Arrayのほとんどのメソッドは静的ですか?

私はこの質問が見つかりました: When is it best to use Static Functions in ASP.NET

をしかし、それは私を満たしていない: -/

+2

( 'Array'などのデザインはASP.NETに関連していないので、私は、ASP.NETタグを削除) –

+0

私はありませんでした彼らはのみのアレイと拡張メソッドのために意図されているので、それらのほとんどは静的で規定うその時に発明された。 – Romoku

+1

@Romokuそれらは依然としてインスタンスメソッドである可能性がありますが、 –

答えて

1

あなたはSystem.Arrayの継承ほとんどの時間は、1次元配列を使用しています。以下のような:

int[] a1 = new int[2]; 

あなたがint[]を定義し、この暗黙的@Sergey RybalkinようSystem.Array型から派生氏は述べています。この場合、メソッドIndexOfは必ず静的メソッドではなくインスタンスメソッドとして実装するのが最適です。

しかしMULT次元アレイのようなのSystem.Arrayを継承する別の種類があります。この場合(多次元)、方法IndexOfは意味をなさない。この

テスト:

int[,] arr = new int[2, 2]; 

arr[0, 0] = 3; arr[1, 0] = 4; 
arr[0, 1] = 5; arr[1, 1] = 6; 

Array.IndexOf(arr, 4); 

は次のように最後があるため、このメソッドはstaticとして実装されていることで、おそらくおそらくメッセージ"Only single dimension arrays are supported here."

とRankExceptionをスローし、そして。

...

コメントIs there a main principle behind the decision, whether to make a method static or not?

についてあり、そして原理は非常に簡単です。インスタンスメソッドは、オブジェクトのアクションまたは動作を表します。静的メソッドは、クラスに関連するロジック、または場合によってはクラスのインスタンスを作成せずに呼び出すメソッドであるシステムの関数です。

SqrtまたはPowのようなメソッドを呼び出すたびにインスタンス数学が必要な場合、どのように混乱するかをSystem.Mathで考えてみてください。私はあなたに与える

最後の例は、System.Text.RegularExpressions.Regexクラスです。このクラスは、インスタンスとして実装されたMatchメソッドと、静的として実装されたオーバーロードを持っています。

それぞれがdiferent文脈で使用されます。このインスタンスは、同じパターンを複数回使用する場合に使用されます。コード内で一意の時刻を使用すると、静的です。

+4

"答えが啓発されたら、マークしてください..." : - Pいいえ..正しい答えであるとマークする*これが正解であれば*。 – Patrick

+0

私はあなたの追加の例がかなり合っているとは思わない。これらの関数*は 'System.Math'インスタンス*を必要としないため、' System.Math'の 'Sqrt'や' Pow'インスタンスメソッドのような関数を作ることには意味がありません。一方、「double」などのさまざまな数値型のインスタンスメソッドを作成することも考えられます。正規表現に関しては、静的メソッドは一意の呼び出しIMOに対して*優れたパフォーマンスを示しません。コードの短縮に役立ちます。 –

+0

@O。 R.マッパーあなたは正しいインスタンスメソッドがより良い実行します。私はテキストを修正しました。 –

関連する問題