10

おそらくばかげた質問で申し訳ありませんが、それは私を悩ませています...

int[] i = {3, 2, 1};
//why
Array.Sort(i);
//instead of
i.Sort();

char c = 'c';
//why
char.IsLetter(c);
//instead of
c.Isletter();
4

4 に答える 4

4

答えを提供するこれらの他の質問を特定してくれた Pedro d'Aquino に感謝します。

基本的なポイントは、構造体のインスタンス メソッドはスレッド セーフではありませんが、静的メソッドはスレッド セーフであるということです。

次の質問を参照してください。

于 2009-06-24T14:16:25.097 に答える
2

これらは、これらのクラスに属する必要のないユーティリティメソッドです。これにより、単一責任の原則が強化されます。

(編集) Java と混同していました

(静的メンバーについて):

静的クラス メンバーを使用して、オブジェクト ID に依存しないデータと動作を分離できます。オブジェクトに何が起こっても、データと関数は変更されません。静的クラスは、クラスにオブジェクト ID に依存するデータまたは動作がない場合に使用できます。

スレッドセーフな観点もまた、正当な理由です。

于 2009-06-24T13:50:26.320 に答える
1

.NET 3.0 を使用している場合は、拡張メソッドを使用して自分で行うことができます。

public static class Extensions
{
public static bool IsLetter(this chr)
{
 return char.IsLetter(chr);
}
}

次に、次のように呼び出します: c.IsLetter()

または、好きなようにします。ソート時も同様

于 2009-06-24T13:43:27.957 に答える
1

実施決定です。フレームワーク設計者の頭の中で何が起こっていたのかはわかりませんが、その理由の 1 つは、カスタム型の配列を最小限の労力で並べ替えることができるようにするためだと思います。

iComparable を実装する任意のクラスを配列に入れて並べ替えることができます。それが配列のメソッドである場合、カスタム型の新しい Array 型を作成する必要があります。

また、他の人が指摘したように、プリミティブ型にはこの配列の設計が必要です。

于 2009-06-24T13:43:42.027 に答える