[C# プログラミング入門] 静的クラス、静的メンバーについて(static)

エントリーポイント(Mainメソッド)を見てみると、staticというキーワードが出てきます。

public static void Main() { }

今まで触れてきませんでしたが、ここで解説します。
これは静的メソッドと呼ばれるものです。

他に静的クラス静的クラスメンバー(静的メソッドはその内の1つ)があります。

簡単にいうとstaticを付けるとnewでインスタンスを作成しなくてもクラスやそのクラスのメンバーにアクセスできるようになります。

インスタンスってなに?ってひとはこちらの記事をどうぞ

[C# 入門] クラスのインスタンスについて
今回はクラスのインスタンスについてです。クラスについての記事にインスタンスというワードが出てきましたが、少しくわしく解説します。インスタンスとは?クラスについてで「クラスを使えるようにするには、newキーワードを使ってインスタンスを作成しま
スポンサーリンク

静的なクラス(static class)

クラスの定義でstaticキーワードを付けるとそのクラスは静的クラスになります。
静的クラスのメンバーはstaticを付けて静的メンバーにする必要があります。

// 静的クラスの定義はこんな感じ
static class Sample
{
    // 静的フィールド
    static public int X;
    // 静的メソッド
    static public void Method() { System.Console.WriteLine(Sample.X); }
}

静的クラスはプログラムが実行されると自動でインスタンスが作成されます。
プログラム実行中、インスタンスは常に1つで新たにインスタンスを作成することはできません。

static class

静的メンバーへのアクセス

静的メンバーへのアクセスはクラス名を使います。
クラス名.メンバー名

// 静的クラスの定義はこんな感じ
static class Sample
{
    // 静的フィールド
    static public int X;
    // 静的メソッド
    static public void Method() { System.Console.WriteLine(Sample.X); }
}

class Program
{
    public static void Main()
    {
        // クラス名.フィールド名
        Sample.X = 100;
        // クラス名.メソッド名
        Sample.Method();
    }
}

出力結果はこんな感じ、

100

静的メンバーへのアクセスのイメージ、

スポンサーリンク

静的クラスメンバー

クラスのメンバーにstaticを付けることができます(クラスはstaticを付けない) 。

class Sample
{
    // 静的フィールド X
    static public int X;
    // 静的メソッド
    static public void Method_static() { }

    // 普通のフィールド Y
    public int Y;
    // 普通のメソッド
    public void Method_dynamic() { }
}
class Program
{
    static void Main()
    {
        Sample a = new Sample();
    }
}

staticが付いたクラスメンバーはプログラム実行時に自動でインスタンスが作成されます。
普通のクラスメンバーはクラスのインスタンスを作成して使います。

静的クラスメンバーはクラスに属していて、
普通のクラスメンバーはクラスのインスタンスに属しています。

何を言っているかというと、
静的クラスメンバーへのアクセスはクラス名を使い、
普通のクラスメンバーへのアクセスはオブジェクト(クラスのインスタンス)を使うということです。

スポンサーリンク

静的クラスメンバーは扱いに注意がいるよ

静的クラスメンバーは常にインスタンスが1つのため、たとえば、

  • 共通のメソッドを作って、色々なところから呼び出す
  • 共通のフィールドを定義して、クラス固有のデータとして使う
  • インスタンスで作ったクラス間の共有データとして使う

などに使われます。
ですが、静的クラスメンバーは様々なところからアクセスができるので取り扱いに注意が必要です。

class Sample
{
    // 静的フィールド X
    static public int X;

    // 静的メソッド
    static public void Method_static()
    {
        // 静的メソッドからは静的フィールドしか使えない
        System.Console.WriteLine($"[Method_static] Sample.X = {Sample.X}");
    }

    // 普通のフィールド Y
    public int Y;

    // 普通のメソッド
    public void Method_dynamic()
    {
        // 静的フィールドの値を表示
        System.Console.WriteLine($"[Method_dynamic] Sample.X = {Sample.X}");
        // 静的フィールドの値を更新
        Sample.X += 10;
        // それぞれのインスタンスのフィールドの値を表示
        System.Console.WriteLine($"[Method_dynamic] this.Y = {this.Y}");
    }
}

class Program
{
    public static void Main()
    {
        // 静的クラスメンバーへのアクセス
        Sample.X = 100;
        Sample.Method_static();

        // 普通のクラスはインスタンスを作成して使う
        Sample a = new Sample() { Y = 200 };
        a.Method_dynamic();

        Sample b = new Sample() { Y = 300 };
        b.Method_dynamic();
    }
}

上のコードの実行結果はこんな感じです。わかりにくいので改行を入れてます。

[Method_static] Sample.X = 100

[Method_dynamic] Sample.X = 100
[Method_dynamic] this.Y = 200

[Method_dynamic] Sample.X = 110
[Method_dynamic] this.Y = 300

6行目のSample.Xの値が+10されています。Method_dynamicの処理で+10をしているからなのですが、このように静的クラスメンバーはいろいろところからアクセスができるため、どこかで値が変わるとそれを参照しているところすべてに影響がでてきます。

スポンサーリンク

静的メソッドの使い道

ここでやっと静的メソッドの説明です。
Mainメソッドの他に、System.Console.WriteLineメソッドも静的メソッドです。

定義を見てみましょう。
VisualStudioを使っている場合、どれでもいいのでコードに書いてある「WriteLine」のところをクリックしてカーソルを持っていきF12ボタンを押します。

public static void WriteLine(string value);

こんな感じでstaticが付いています。
さらに上の方にいってクラスの定義を見てみると、

public static class Console

と、静的クラスになっています。
このように、よく使うメソッドはいちいちクラスのインスタンスを作成してメソッドを呼び出すというのは面倒くさいので、静的メソッドとして定義して使います。

これは他のプログラミング言語の関数のような使われ方です。


C# プログラミング講座に戻る

コメント

タイトルとURLをコピーしました