2012-04-05 10 views
13

静的メソッドと静的メソッドを使用する静的メソッドと静的メソッドを使用する一般的なメリット(または欠点)同じ静的メソッド以外私は非静的なクラスから静的メソッドを拡張メソッドとして使用できないという事実。例えば低レベルの違い:静的メソッドを使用した非静的クラスと静的メソッドを使用した静的クラスとの比較

:この対

class NonStaticClass 
{ 
    public static string GetData() 
    { 
     return "This was invoked from a non-static class."; 
    } 
} 

static class StaticClass 
{ 
    public static string GetData() 
    { 
     return "This was invoked from a static class."; 
    } 
} 

別の上に1つの方法を使用してのパフォーマンス/メモリへの影響は何ですか?

注:私はクラスをインスタンス化する必要はないと仮定します。私のユースケースのシナリオは次のようなものに限定されます。

Console.WriteLine(NonStaticClass.GetData()); 
Console.WriteLine(StaticClass.GetData()); 

答えて

16

主な利点は、クラスを静的にすると、コンパイラはクラスに静的メンバーしか持たないことを確認します。

誰もがコードを読んでいるとすぐにそのクラスがインスタンス化できないことを知り、そのクラスのインスタンスとみなすための対話はありません。何もできないので。

clrレベルでは、staticという概念はありません。静的クラスはabstractsealedであり、継承とインスタンス化を効果的に防止します。

パフォーマンスに関しては、コンパイラやランタイムが最適化する可能性はありません。

この例では、読者に可能な限り明確にあなたの意図を表現することに焦点を合わせます。後で常に最適化することができます。

3

いくつかの特殊性/制限があります。

  • あなたは静的クラス
  • を継承することはできません
  • 静的クラスをインスタンス化することはできません

あなたのクラス(ヘルパー/ユーティリティや拡張メソッドコンテナなど)の動作を制限する場合は、それをstaticにしてください。

+0

私の編集したポストをユースケースのシナリオで確認してください - インスタンス化せずに使用することで違いがあるのだろうかと思っていました。 –

+0

投稿を更新しました。 –

+4

あなたが言及したポイントに加えて、ローカル変数、フィールドまたは仮パラメータのタイプとして静的クラスを使用することもできません。配列の要素型としては使用できません。ジェネリック型引数リストの型引数としては使用できません。 –

2

パフォーマンスの影響:基本的にはなし。

NonStaticClassのインスタンスを作成することはできますが、非静的オーバーライドメソッドがないため、object obj = new object()と言っても大変便利です。多分ロックすると便利です。クラスを静的にすることで、誰かがそれを新しくできないようにすることができますが、実際にはそうではありません。ダメージ

これは、クラスのインスタンスを作成する理由がないという自己記述方法です。

3

利点や欠点はありません。 これは単なるアーキテクチャ上の決定です。

関数セットまたは関数libriaryを提供する場合は、静的専用クラスを使用してください。 インスタンス化することはできませんが、そのように使用できます。

MyMathLibrary.Plot(...) 

このタイプは通常ある状態より少ない動作を意味します。繰り返します、通常です。静的メンバーと

使用シンプルなクラスあなたが「ノーマル」タイプを持っていますが、例えばのように、何とかステートレス方法が必要になります。

public class MyType 
{ 
    .... //some members 

    public static MyType ReadFromXml(XmlReader reader) {} 
    public static void SaveToXml(MyType mt) {} 
} 

それは建築家だけの問題だ、特効薬はありません選択。

+0

@Dennis Delimarsky:なぜ私のユースケースのシナリオは...のように限定されていますか?私は*制限*のようには見ません。あなたのアーキテクチャーに依存して、あなたのAPIの動作を明示的にすることによって、*本当に良い*デザインの選択肢になるかもしれません。 – Tigran

+0

これは、実際にクラスをインスタンス化するつもりはないことを示すためのサンプルです。 –

関連する問題