Static

Static 宣言と Object Class の関係です。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. 一般的に Object Class は new で生成して初めて領域(実態)が割り当てられます。
    所が static で宣言された領域は、起動したときから実態が割り当てられています。
    しかもその領域は new で生成される全 Class を通じて1個だけです。
    今回はそのあたりのところを確かめてみます。
  2. static を使った Object Class です。
    m_msg, m_num が static で宣言されていることに注目して下さい。
    各領域に対して get, put アクセッサを定義しているので少し長くなっています。
    C# 3.0 以降では、次の形式でアクセッサを定義することが出来ます。
    static string m_msg { get; set; }
    class Sample
    {
        static string   m_msg;
        static int      m_num;
        string          msg;
        int             num;
    
        public Sample(string str, int val)
        {
            m_msg = str;
            msg = str;
            m_num = val;
            num = val;
        }
        static public string m_Msg
        {
            set { m_msg = value; }
            get { return m_msg; }
        }
        public string Msg
        {
            set { msg = value; }
            get { return msg; }
        }
        static public int m_Num
        {
            set { m_num = value; }
            get { return m_num; }
        }
        public int Num
        {
            set { num = value; }
            get { return num; }
        }
        public void print()
        {
            Console.WriteLine("msg:" + msg + "  num:" + num +
                              "  m_msg:" + m_msg + "  m_num:" + m_num);
        }
    }
    
  3. Object Class を呼び出す Main() プログラムです。
    cls_1 と cls_2 を生成して領域の値を印字します。
    このとき m_msg, m_num は cls_2 の値で上書きされます。
    Sample.m_Msg = "new message"; Sample.m_Num = 9; は両クラスに共通で、新しい値に書き換えられます。
    cls_1.Num = 11; cls_2.Num = 22; でそれぞれの num の領域を書き換えます。
    印字結果がどうなるか想像がつくでしょう。
    /*************************************/
    /*★ C# Class(Static)    前田 稔 ★*/
    /*************************************/
    using System;
    
    class console
    {
        public static int Main()
        {
            Sample  cls_1 = new Sample("class-1", 1);
            Sample  cls_2 = new Sample("class-2", 2);
            cls_1.print();
            cls_2.print();
    
            Sample.m_Msg = "new message";
            Sample.m_Num = 9;
            cls_1.Num = 11;
            cls_2.Num = 22;
            cls_1.print();
            cls_2.print();
            Console.ReadLine();
            return 0;
        }
    }
    
  4. プログラムの実行結果です。
    msg, num は各クラス固有の値ですが、m_msg, m_num は両クラスで共有されていることを確かめて下さい。
    msg:class-1  num:1  m_msg:class-2  m_num:2
    msg:class-2  num:2  m_msg:class-2  m_num:2
    msg:class-1  num:11  m_msg:new message  m_num:9
    msg:class-2  num:22  m_msg:new message  m_num:9
    

static public で宣言

  1. get, put アクセッサを使わずに public で宣言してみます。
    public 宣言でクラス外から直接アクセスする方法は従来から使われているのですが、あまりお勧め出来る方法とは言えないかも知れません。
    /*************************************/
    /*★ C# Class(Static)    前田 稔 ★*/
    /*************************************/
    using System;
    
    class console
    {
        public static int Main()
        {
            Sample  cls_1 = new Sample("class-1", 1);
            Sample  cls_2 = new Sample("class-2", 2);
            cls_1.print();
            cls_2.print();
    
            Sample.m_msg = "new message";
            Sample.m_num = 9;
            cls_1.num = 11;
            cls_2.num = 22;
            cls_1.print();
            cls_2.print();
            Console.ReadLine();
            return 0;
        }
    }
    
    class Sample
    {
        static  public string   m_msg;
        static  public int      m_num;
        public  string          msg;
        public  int             num;
    
        public Sample(string str, int val)
        {
            m_msg = str;
            msg = str;
            m_num = val;
            num = val;
        }
        public void print()
        {
            Console.WriteLine("msg:" + msg + "  num:" + num +
                              "  m_msg:" + m_msg + "  m_num:" + m_num);
        }
        static public void print2(Sample obj)
        {
            Console.WriteLine("msg:" + obj.msg + "  num:" + obj.num +
                              "  m_msg:" + m_msg + "  m_num:" + m_num);
        }
    }
    
  2. class Sample の領域は public で宣言します。
    これらの領域はクラス外から直接アクセスすることが出来ます。
        static  public string   m_msg;
        static  public int      m_num;
        public  string          msg;
        public  int             num;
    
  3. static public で宣言された領域は、全 Object Class を通じてただ一つの領域です。
    public で宣言された領域は、Class 毎に異なる領域です。
    これらのことを頭に置いて、実行を確認して下さい。
            Sample.m_msg = "new message";
            Sample.m_num = 9;
            cls_1.num = 11;
            cls_2.num = 22;
            cls_1.print();
            cls_2.print();
    
  4. 実行結果は先のプログラムと同じです。
    msg:class-1  num:1  m_msg:class-2  m_num:2
    msg:class-2  num:2  m_msg:class-2  m_num:2
    msg:class-1  num:11  m_msg:new message  m_num:9
    msg:class-2  num:22  m_msg:new message  m_num:9
    

超初心者のプログラム入門(C# Frame Work)