C#基礎知識シリーズ6(静的クラスと静的クラスメンバー)


静的クラス
静的クラスは非静的クラスとほぼ同じですが、静的クラスはインスタンス化できません.すなわち,newキーワードを用いて静的クラスタイプの変数を作成することはできない.インスタンス変数がないため、クラス名自体を使用して静的クラスのメンバーにアクセスします.たとえば、UtilityClassという名前の静的クラスにMethodAという共通メソッドがある場合は、次の例で呼び出されます.
    public class UtilityClass
    {
        public static void MethodA()
        { 
            ////
        }
    }

    class TestCounter
    {
        static void Main()
        {
            UtilityClass.MethodA();
            Console.ReadKey();
        }
    }

入力パラメータのみを演算して内部インスタンスフィールドを取得または設定しないメソッドセットの場合、静的クラスは、これらのメソッドセットのコンテナとして便利に使用できます.例えば、.NET Frameworkクラスライブラリでは、静的クラスSystem.Mathに含まれるメソッドは、特定のMathクラスインスタンス固有のデータを格納または取得することなく、数学演算のみを実行します.すなわち、次の例で説明するように、クラス名とメソッド名を指定してクラスメンバーを適用します.
double dub = -3.14;
Console.WriteLine(Math.Abs(dub));
Console.WriteLine(Math.Floor(dub));
Console.WriteLine(Math.Round(Math.Abs(dub)));

// Output:
// 3.14
// -4
// 3

すべてのクラスタイプと同様に、静的クラスを参照するプログラムをロードすると、NET Framework共通言語ランタイム(CLR)は、静的クラスのタイプ情報をロードします.プログラムは静的クラスをロードする正確な時間を指定できません.ただし、プログラムでクラスを最初に参照する前にクラスをロードし、クラスのフィールドを初期化し、静的構造関数を呼び出すことを保証できます.静的コンストラクション関数は1回のみ呼び出され、プログラムが存在するアプリケーションドメインの生存期間中、静的クラスはメモリに保持されます.
独自のインスタンスの作成のみを許可する非静的クラスを作成するには、C#の単一のモードhttp://www.cnblogs.com/aehyok/archive/2013/05/08/3066127.htmlを参照してください.
静的クラスの主なプロパティ:1:静的メンバーのみが含まれます.2:インスタンス化できません.3:密封されています.4:インスタンスコンストラクション関数を含めることはできません.
したがって、静的クラスの作成は、静的メンバーとプライベートコンストラクタのみを含むクラスの作成と基本的に同じです.プライベートコンストラクション関数は、クラスがインスタンス化されることを阻止します.静的クラスを使用する利点は、コンパイラがインスタンスメンバーを偶然追加しないようにチェックを実行できることです.コンパイラは、このようなインスタンスを作成しないことを保証します. 
静的クラスは密封されているため、継承できません.これらはObject以外のクラスから継承できません.静的クラスにはインスタンスコンストラクション関数は含まれませんが、静的コンストラクション関数を含めることができます.非静的クラスに重要な初期化が必要な静的メンバーが含まれている場合は、静的構造関数も定義します.
 
静的クラスメンバー
非静的クラスには、静的メソッド、フィールド、プロパティ、またはイベントが含まれます.クラスのインスタンスが作成されていなくても、クラスの静的メンバーを呼び出すことができます.静的メンバーには、インスタンス名ではなくクラス名で常にアクセスします.クラスに複数のインスタンスを作成しても、静的メンバーには1つのコピーしかありません.静的メソッドおよびプロパティは、タイプに含まれる非静的フィールドおよびイベントにアクセスできず、メソッドパラメータで明示的に渡されない限り、オブジェクトのインスタンス変数にアクセスできません.
より一般的な方法は、クラス全体を静的クラスとして宣言するのではなく、静的メンバーを持つ非静的クラスを宣言することです.静的フィールドには、インスタンス化されたオブジェクトの数を記録する方法と、すべてのインスタンス間で共有する必要がある値を格納する方法の2つが一般的です.
静的メソッドは、クラスに属し、クラスのインスタンスに属していないため、リロードできますが、書き換えることはできません.
フィールドはstatic constと宣言できませんが、constフィールドの動作は本質的に静的です.このようなフィールドはタイプに属し、タイプのインスタンスには属しません.したがって、ClassNameは静的フィールドと同様に使用することができる.MemberName表現はconstフィールドにアクセスします.オブジェクトインスタンスは必要ありません.
C#は静的ローカル変数(メソッド範囲内で宣言された変数)をサポートしません.
次の例では、staticキーを使用して、メンバーの戻りタイプの前に静的クラスメンバーを宣言します.
 
public class Automobile
{
    public static int NumberOfWheels = 4;
    public static int SizeOfGasTank
    {
        get
        {
            return 15;
        }
    }
    public static void Drive() { }
    public static event EventType RunOutOfGas;
}

静的メンバーは、最初にアクセスされる前に、静的構造関数(存在する場合)を呼び出す前に初期化されます.静的クラスメンバーにアクセスするには、次の例に示すように、変数名ではなくクラス名を使用してメンバーの場所を指定します.
Automobile.Drive();
int i = Automobile.NumberOfWheels;

クラスに静的フィールドが含まれている場合は、クラスのロード時にこれらのフィールドを初期化する静的構造関数を指定します.
静的メソッドの呼び出しはMicrosoft中間言語(MSIL)で生成され、インスタンスメソッドの呼び出しはnullオブジェクト参照もチェックされるcallvirtコマンドを生成します.しかし、両者のパフォーマンスの違いは、ほとんどの場合明らかではありません.
 
1:静的クラスはメモリに常に位置しています.2:非静的クラスは、インスタンス化後はメモリ内で独立しており、変数は重複せず、使用後に破棄されるため、不明なエラーは発生しません.C#では静的メンバーは敏感なもので、十分に確認されていない場合は使用しないでください.3:一般クラス(非静的クラス)をより多く使用することを推奨します.
4:定義されたクラスがインスタンス化する必要がない場合、静的クラスを使用します.オブジェクトをインスタンス化したり、継承したりする必要がある場合は、非静的クラスを使用し、統一的に使用する変数とメソッドを静的に設定すると、すべてのインスタンスオブジェクトがアクセスできます.