6

これは、すべての設計ガイドラインに反するようです。型 T の単一の引数を受け入れる静的メソッドは、通常、単なるメンバー メソッドであるべきです。

IsUpper が存在することを理解するために、実際にStackOverflow の質問を投稿する必要がありました (オートコンプリートに表示されなかったため)。

編集

私の以前の発言には少し説明が必要であることは理解しています。良い設計の例は String.ToLower() です。static void ToLower(String foo) としてプロトタイプ化される代わりに、メンバー メソッドです。同じことがchar.IsLower()にも当てはまることは(少なくとも私には)明らかです。

4

3 に答える 3

7

構造体のインスタンス メソッドはスレッド セーフではありません。一方、静的メソッド.

静的メソッドは構造体のコピーを受け取り、インスタンス メソッドはマネージ ポインターを受け取ります。ポインターを介してデータにアクセスすることは、安全な操作ではなく、簡単に競合状態につながる可能性があります。

そのため、構造体/プリミティブのほとんどのメソッドはインスタンスではなく静的です。

ここで同様の質問を参照してください。

IsNan がインスタンス プロパティではなく、Double クラスの静的メソッドであるのはなぜですか?

于 2008-12-23T16:45:31.537 に答える
3

この質問も参照してください。

短いバージョン - 最初の IDE は、文字列リテラルから呼び出されたときに Intellisense を思い付くのに問題がありました (そして、char リテラルも想定しています)。そのため、設計者はこの問題を回避するためにメソッドを静的にしました。

再編集: ここで、IDE 設計者からの圧力に屈する .NET 設計者について、少し不満を言いました。しかし、この質問に対するポップの答えを見たので、今ではこれについてあまり確信が持てません。

EDIT2: コメントのティムは、これが真実であることを知っていたのか、それとも単なる推測なのかを尋ねました。この問題への正確な参照は見つかりませんでしたが、2002 年の記事で、文字列リテラルのインテリセンス バグについて話している記事を見つけました。このページの半分くらいです。

于 2008-12-23T16:20:14.177 に答える
2

私の観点では、それは理にかなっています。

単一の引数を受け入れる多くの静的メソッドがあります。次のようなものを使用して平方根を計算するのはあまり良くありません。

double d = 100.0;
Console.WriteLine("Square root of d is " + d.Sqrt());

これにより、OO 設計の観点からは「結束」が低下しますが、これは適切な方法ではありません。Mathこの責任をクラスに分けたほうがいいでしょう。

double d = 100.0;
Console.WriteLine("Square root of d is " + Math.Sqrt(d));
于 2008-12-23T16:44:32.803 に答える