web-dev-qa-db-ja.com

C#静的クラスを使用する理由

可能性のある複製:
C#で静的クラスを使用する場合

私はクラスを静的に設定しましたが、静的を使用するかどうか、または使用するかどうかの違いはわかりません。

誰か説明してくれますか?

22
ShadowG

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

31
Dylan Smith

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

クラスは静的と宣言でき、静的メンバーのみが含まれていることを示します。 newキーワードを使用して静的クラスのインスタンスを作成することはできません。静的クラスは、クラスを含むプログラムまたは名前空間が読み込まれると、.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
}
15
Enigma State

静的クラスは特定の状況で役立つ場合がありますが、ほとんどの言語機能と同様に、静的クラスは悪用および/または乱用される可能性があります。

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

注意点は、過剰な静的メソッド自体が設計戦略の欠陥を示している可能性があるということです。静的関数を作成するとき、自分自身に尋ねるのが良いことです-a)インスタンスメソッド、またはb)インターフェイスへの拡張メソッドのいずれかに適しているでしょうか。ここでの考え方は、オブジェクトの動作は通常オブジェクトの状態に関連付けられているということです。つまり、動作はオブジェクトに属している必要があります。静的関数を使用することにより、動作が特定のオブジェクトに属してはならないことを意味しています。

ポリモーフィックおよびインターフェイス駆動型の設計は、静的関数の過剰使用によって妨げられます。派生クラスでオーバーライドしたり、インターフェイスにアタッチしたりすることはできません。通常、インターフェイスのすべてのインスタンスがその共有された「ヘルパー」機能にアクセスできるように、拡張メソッドを介してインターフェイスに「ヘルパー」関数を結び付けることをお勧めします。

私の意見では、静的関数が間違いなく有用な状況の1つは、.Create()または.New()メソッドを作成してオブジェクト作成のロジックを実装することです。たとえば、作成するオブジェクトをプロキシする場合、

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

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

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

3
Sean Thoman