English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C#の静的クラス、メソッド、コンストラクタ、フィールド

C#では、静的はインスタンス化できないことを意味します。静的クラスのオブジェクトを作成することはできませんし、オブジェクトを使用して静的メンバーにアクセスすることもできません。

クラス、変数、メソッド、プロパティ、演算子、イベント、コンストラクタは static修飾子キーワードを使用して静的として定義できます。

静的クラス

クラス名の前におよびアクセス修飾子の後に static修飾子を適用して、クラスを静的にします。以下に静的字段とメソッドを持つ静的クラスを定義しています。

public static class Calculator
{
    private static int _resultStorage = 0;
    
    public static string Type = "Arithmetic";
    public static int Sum(int num1, int num2)
    {
        return num1 + num2;
    }
    public static void Store(int result)
    {
        _resultStorage = result;
    }
}

上記の Calculator クラスは静的です。そのすべてのメンバーも静的です。

静的クラスのオブジェクトを作成することはできません。したがって、以下のようにクラス名 ClassName.MemberName を使用して静的メンバーに直接アクセスできます。

class Program
{
    static void Main(string[] args)
    {
        var result = Calculator.Sum(10, 25); //静的方法を呼び出す
        Calculator.Store(result); 
        var calcType = Calculator.Type; // 静的変数にアクセス
        Calculator.Type = "Scientific"; // 静的字段に値を割り当てます
    }
}

静的クラスのルール

  1. 静的クラスはインスタンス化できません。

  2. 静的クラスのすべてのメンバーは静的でなければなりません。そうでないと、コンパイラはエラーを返します。

  3. 静的クラスは静的変数、静的メソッド、静的プロパティ、静的演算子、静的事件、および静的コンストラクタを含むことができます。

  4. 静的クラスはインスタンスメンバーとコンストラクタを含むことができません。

  5. インデクサーやデストラクタは静的ではありません

  6. varは静的メンバーの定義には使用できません。staticキーワードの後で明示的にメンバーのタイプを指定する必要があります。

  7. 静的クラスはシールドクラスであり、したがって継承できません。

  8. 静的クラスは他のクラスを継承できません。

  9. ClassName.MemberName(つまり:クラス名.メンバー名)を使用して静的クラスメンバーにアクセスできます。

  10. 静的クラスは、プログラムが存在するアプリケーションドメインの全体のライフサイクル中にメモリに保持されます。

非静的クラスの静的メンバー

普通のクラス(非静的クラス)は、1つまたは複数の静的メソッド、フィールド、プロパティ、イベント、および他の非静的メンバーを含むことができます。

静的字段を使用して非静的クラスを定義することで、静的クラス全体を宣言するよりも実用的です。

静的字段

staticキーワードを使用して非静的クラス内で静的字段を定義できます。

非静的クラスの静的字段はすべてのインスタンス間で共有されます。したがって、1つのインスタンスで行った変更は他のインスタンスに反映されます。

public class StopWatch
{
    public static int InstanceCounter = 0;
    // インスタンス構造関数
    public StopWatch()
    {
    }
}
class Program
{
    static void Main(string[] args)
    {
        StopWatch sw1 = new StopWatch();
        StopWatch sw2 = new StopWatch();
        Console.WriteLine(StopWatch.NoOfInstances); //2 
        StopWatch sw3 = new StopWatch();
        StopWatch sw4 = new StopWatch();
        Console.WriteLine(StopWatch.NoOfInstances);//4
    }
}

静的方法

非静的クラスで静的メソッドを定義できます。静的メソッドはオブジェクトを作成せずに呼び出すことができます。非静的クラスのオブジェクトでは静的メソッドを呼び出すことができません。

静的メソッドは他の静的メソッドを呼び出し、静的字段にアクセスできます。静的メソッドでは、クラスの非静的メンバーにアクセスできません。

class Program
{
    static int counter = 0;
    string name = "Demo Program";
    static void Main(string[] args)
    {
        counter++; // 静的字段にアクセスできます
        Display("Hello World!"); // 静的メソッドを呼び出すことができます
        name = "New Demo Program"; //エラー:非静的メンバーへのアクセスができません
        SetRootFolder("C:\MyProgram"); //エラー:非静的メソッドを呼び出すことができません
    }
    static void Display(string text)
    {
        Console.WriteLine(text);
    }
    public void SetRootFolder(string path) { }
}

静的方法のルール

  1. 静的方法はstaticキーワードを使用して定義し、アクセス修飾子の後に定義されます。

  2. 静的方法はオーバーロードできますが、オーバーライドすることはできません。

  3. 静的方法にはローカルの静的変数を含むことができます。

  4. 静的方法は非静的変数にアクセスしたり呼び出したりすることはできませんが、それらが明示的にパラメータとして渡された場合を除きます。

静的構造関数

非静的クラスにはパラメータのない静的構造関数を含むことができます。staticキーワードを使用して定義し、アクセス修飾子(例:public、private、protected)を使用することはありません。

以下の例では、静的構造関数とインスタンス構造関数の違いを示しています。

public class StopWatch
{
    // 静的構造関数
    static StopWatch()
    {
        Console.WriteLine("静的構造関数が呼び出されました");
    }
    // インスタンス構造関数
    public StopWatch()
    {
        Console.WriteLine("インスタンス構造関数が呼び出されました");
    }
    // 静的方法
    public static void DisplayInfo()
    {
        Console.WriteLine("DisplayInfoが呼び出されました");
    }
    // インスタンスメソッド
    public void Start() { }
    // インスタンスメソッド
    public void Stop() { }
}

上記の静的クラスStopWatchには静的構造関数と非静的構造関数が含まれています。

静的方法やインスタンスの初回作成時に静的構造関数は一度だけ呼び出されます。以下の例では、staticメソッドが初めて呼び出されたときに静的構造関数が呼び出されます。静的方法を再度呼び出しても静的構造関数は呼び出されません。

StopWatch.DisplayInfo(); // ここで静的構造関数が呼び出されます
StopWatch.DisplayInfo(); // ここでは構造関数が呼び出されていません
出力:
静的構造関数が呼び出されました。
DisplayInfoが呼び出されました
DisplayInfoが呼び出されました

以下の例では、インスタンスが初めて作成されたときに静的構造関数が呼び出されることを示しています。

StopWatch sw1 = new StopWatch(); // まずは静的構造関数、次にインスタンス構造関数が呼び出されます 
StopWatch sw2 = new StopWatch();// インスタンス構造関数のみが呼び出されました 
StopWatch.DisplayInfo();
出力:
静的構造関数が呼び出されました
インスタンス構造関数が呼び出されました
インスタンス構造関数が呼び出されました
DisplayInfoが呼び出されました

静的構造関数のルール

  1. 静的構造関数は static キーワードで定義され、public、private、protected などのアクセス修飾子を使用していません。

  2. 非静的クラスには無引数の静的コンストラクタを含むことができます。パラメータ化された静的コンストラクタの使用は許可されていません。

  3. 静的コンストラクタはそのライフサイクル中に一度だけ実行されます。したがって、複数の場所でクラスを使用している場合、アプリケーション内でその呼び出し時期を特定することができません。

  4. 静的コンストラクタは静的メンバーのみをアクセスできます。インスタンスメンバーを含んだりアクセスしたりすることはできません。

静的メンバーは「高頻度ヒープ」と呼ばれる特別なメモリ領域に格納されます。非静的クラスの静的メンバーはそのクラスのすべてのインスタンス間で共有されます。したがって、あるインスタンスで行った変更はすべての他のインスタンスに反映されます。