2011-10-28 4 views
17

可能性の重複:
When to Use Static Classes in C#C#静的クラスなぜ使用しますか?

私は静的たくさんのように私のクラスを設定しますが、静的かを使用する場合、私はわからない、または何それはそれを使用できるようになり違いはありますかない。

誰でも説明してください。

+1

スタティッククラス/メソッドは、例えばシングルトンパターンとファクトリパターンを実装するのに便利です。 – Yahia

+2

@Yahia:スタティッククラスを持つシングルトンパターン? [私はそうは思わない](http://stackoverflow.com/questions/3565482/can-singleton-class-be-static/3565496#3565496) – BoltClock

+0

@BoltClockあなたが慎重に読んだら、私は "静的なクラス/メソッド "と私はかなり静的メソッドがシングルトンパターンを実装するときに便利だと確信しています... – Yahia

答えて

26

静的なクラスを作成するだけで、人々がそのインスタンスを作成しようとするのを防ぐことができます。すべてのクラスが静的メンバーである場合は、そのクラス自体を静的にすることをお勧めします。

+5

静的なすべてのメンバーを持っている場合、クラスを静的にするのはなぜ良い練習ですか?クラス自体を静的にする利点は何ですか? –

+2

それは人々がそれをインスタンス化しようとしないようにします –

+5

しかし、その目的のために、プライベートコンストラクタを宣言して、クラスSingletonを作ることができます。私が知る限り、静的クラスは常にメモリに残ってオーバーヘッドを作成しますが、通常のシングルトンクラスは保持しません。 –

11

クラスが静的変数として宣言されている場合、変数とメソッドは静的変数として強制的に宣言する必要があります。

クラスは静的であると宣言することができ、静的メンバーのみを含むことを示します。新しいキーワードを使用して静的クラスのインスタンスを作成することはできません。静的クラスは、そのクラスを含むプログラムまたは名前空間が読み込まれると、.NET Framework共通言語ランタイム(CLR)によって自動的に読み込まれます。

静的クラスを使用して、特定のオブジェクトに関連付けられていないメソッドを格納します。たとえば、インスタンスデータには作用せず、コード内の特定のオブジェクトに関連付けられていない一連のメソッドを作成することが一般的な要件です。これらのメソッドを保持するには静的クラスを使用できます。

- 静的クラスの>主な機能は次のとおりです。

  • 彼らは静的メンバーのみが含まれています。
  • インスタンス化することはできません。
  • 封印されています。
  • インスタンスコンストラクタやコンストラクタは、オブジェクトに関連付けられ、オブジェクトの作成時にデータに作用することがわかっているため、コンストラクタを含むことはできません。

static class CollegeRegistration 
{ 
    //All static member variables 
    static int nCollegeId; //College Id will be same for all the students studying 
    static string sCollegeName; //Name will be same 
    static string sColegeAddress; //Address of the college will also same 

    //Member functions 
    public static int GetCollegeId() 
    { 
    nCollegeId = 100; 
    return (nCollegeID); 
    } 
    //similarly implementation of others also. 
} //class end 


public class student 
{ 
    int nRollNo; 
    string sName; 

    public GetRollNo() 
    { 
     nRollNo += 1; 
     return (nRollNo); 
    } 
    //similarly .... 
    public static void Main() 
    { 
    //Not required. 
    //CollegeRegistration objCollReg= new CollegeRegistration(); 

    //<ClassName>.<MethodName> 
    int cid= CollegeRegistration.GetCollegeId(); 
    string sname= CollegeRegistration.GetCollegeName(); 


    } //Main end 
} 
+0

は、強制的に強制的に強制的に強制的に強制的に –

3

静的クラスは、特定の状況で役立ちますが、乱用および/またはほとんどの言語機能のように、それらを酷使する可能性があります。

Dylan Smithがすでに述べたように、静的なクラスを使用する最も明白なケースは、静的なメソッドのみを持つクラスがある場合です。開発者がそのようなクラスをインスタンス化できるようにすることには意味がありません。

静的メソッドが多すぎると、デザイン戦略に欠陥がある可能性があります。静的関数を作成するときには、a)インスタンスメソッド、またはb)インターフェイスへの拡張メソッドのどちらかに適しているかどうかを確認することができます。ここでのアイデアは、オブジェクトの振る舞いは通常、オブジェクトの状態に関連付けられているということです。振る舞いはオブジェクトに属すべきです。静的関数を使用することによって、その動作が特定のオブジェクトに属してはならないことを意味しています。

多態性およびインターフェイス駆動型デザインは、静的関数を過度に使用することによって妨げられます。派生クラスでオーバーライドすることも、インターフェイスにアタッチすることもできません。通常は、ヘルパ関数を拡張メソッドを介してインタフェースに結び付け、インタフェースのすべてのインスタンスがその共有「ヘルパー」機能にアクセスできるようにしてください。

私の意見では、オブジェクト作成のロジックを実装するために.Create()メソッドや.New()メソッドを作成することが、静的関数が非常に便利な状況の1つです。例えば、

public class Foo 
{ 
    public static Foo New(string fooString) 
    { 
     ProxyGenerator generator = new ProxyGenerator(); 

     return (Foo)generator.CreateClassProxy 
      (typeof(Foo), new object[] { fooString }, new Interceptor()); 
    } 

これは、そのメソッドに割り当てられた特定の属性、たとえばに基づいて、あなたがオブジェクトに機能を注入/インターセプトしたい(城動的プロキシのような)プロキシフレームワークで使用することができます。全体的な考え方は、特殊な機能を追加して元のインスタンスのコピーを作成するのが技術的に特殊なコンストラクタを必要とするということです。

関連する問題