hakeの日記

Windows環境でプログラミングの勉強をしています。

C# - クラス - 変数と定数

クラスが持つ変数としては、静的(クラス)変数とインスタンス変数がある。
静的変数は、クラスで共通して一つ持ち、インスタンス変数はインスタンス毎に同名の変数を別に持つ。
静的変数は「クラス名.変数名」と書き、インスタンス変数は「インスタンス名.変数」と書いてアクセスを行う。定数もクラスフィールードで定義したものは、静的変数と同様に「クラス名.定数名」で読みだす。

using System;

//静的(クラス)変数とインスタンス変数と定数

class MyClass
{
    public static int st = 0;
    public int ins = 0;
    public const int c = 999;
    
    //変数値を表示する
    public void PrintVars(string s)
    {
        Console.WriteLine("インスタンス {0}", s);
        Console.WriteLine("  静的変数          : {0}", st);
        Console.WriteLine("  インスタンス変数  : {0}", ins);
        Console.WriteLine("  定数              : {0}", c);
    }

    //静的変数に値を代入する
    public void SetStaticVar(string s, int i)
    {
        Console.WriteLine("インスタンス {0} のメソッドで", s);
        Console.WriteLine("  静的変数に{0}を代入", i);
        MyClass.st = i;
    }
}

class MyMain
{
    static void Main(string[] args)
    {
        //静的変数に直接代入
        Console.WriteLine("静的変数に直接 10 を代入");
        MyClass.st = 10;
        //静的変数と定数の直接読み出し
        Console.WriteLine("静的変数 : {0}", MyClass.st);
        Console.WriteLine("定数     : {0}", MyClass.c);

        //インスタンスaを作成
        MyClass a = new MyClass();
        // 静的変数に代入はできない
        //a.st = 99;
        //インスタンス変数に代入
        Console.WriteLine("インスタンス変数に100を代入");
        a.ins = 100;
        
        a.PrintVars("a");
        //インスタンスbを作成
        MyClass b = new MyClass();
        Console.WriteLine("インスタンス変数に200を代入");
        b.ins = 200;
        b.PrintVars("b");

        //インスタンスaから静的変数に代入
        a.SetStaticVar("a", 20);
        a.PrintVars("a");
        b.PrintVars("b");

    }
}

実行結果

静的変数に直接 10 を代入
静的変数 : 10
定数     : 999
インスタンス変数に100を代入
インスタンス a
  静的変数          : 10
  インスタンス変数  : 100
  定数              : 999
インスタンス変数に200を代入
インスタンス b
  静的変数          : 10
  インスタンス変数  : 200
  定数              : 999
インスタンス a のメソッドで
  静的変数に20を代入
インスタンス a
  静的変数          : 20
  インスタンス変数  : 100
  定数              : 999
インスタンス b
  静的変数          : 20
  インスタンス変数  : 200
  定数              : 999