18

これはフレームワーク設計の問題だと思います。System.Array のほとんどのメソッドが静的である理由を最近知りました。私の直観的な反応は、System.Array.IndexOf(array, object) としてではなく、たとえば Array インスタンスで常に IndexOf(object) を使用することです。メソッドを静的にするかどうかの決定の背後にある主な原則はありますか?

この質問を見つけました: ASP.NET で静的関数を使用するのが最適な場合

しかし、それは私を満足させませんでした:-/

4

1 に答える 1

1

継承するほとんどの時間System.Arrayは、単一次元配列を使用しています。お気に入り:

int[] a1 = new int[2];

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

しかし、多次元配列のように 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);

最後の like は、メッセージとともに RankException をスローします"Only single dimension arrays are supported here."

おそらく、そして最も可能性が高いのは、このメソッドが静的として実装されているためです。

...

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

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

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

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

それぞれが異なるコンテキストで使用されます。インスタンスは、同じパターンを複数回使用する場合に使用されます。コード内で一意の時間にパターンを使用する場合の静的。

于 2013-05-23T13:16:44.837 に答える