50425


コメント部のコードなのですが`int a;`をなぜstaticにしないとエラーになるのでしょうか？  
staticはいくつインスタンスを生成しても一個だけ生成されるという意味だと思うのですが、  
その辺はc++などと違うのでしょうか？またpublicやprivateなども付けてみましたがエラーになります。

[code]

    using System;
    //using Console;
    //using System.ValueTuple;
    
    class CodeFile1
    {
        int a;
        static int[] x;
    
        static void Main()
        {
            a = 5;  //ここのコードです。
            x = new int[5];
            int[] num = new int[5] { 1, 2, 3, 4, 5 };
            for (int i=0; i< num.Length; i++)
            {
                Console.WriteLine(num[i]);
            }
            Console.ReadKey();
        }
    }
    
[/code]


CC BY-SA 4.0
2018-11-18T06:03:55.617
50409
2018-11-19T01:24:24.843
2018-11-19T01:24:24.843
19110
question
c#
Main関数のあるクラスでstaticを書かないとMain関数で参照？できない理由が知りたい。


[静的メンバー](https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-
guide/classes-and-structs/static-classes-and-static-class-members#static-
members)で

> 静的メソッドと静的プロパティは、それを含んでいる型の非静的フィールドや非静的イベントにはアクセスできません。また、メソッド
> パラメーターに明示的に渡されない限り、どのオブジェクトのインスタンス変数にもアクセスできません。

と説明されている通り、静的メソッド`Main`から非静的フィールド`a`にはアクセスできません。ただし、これはC#言語だけでなくC++言語においても[`static`](https://msdn.microsoft.com/ja-
jp/library/y5f6w579.aspx#Anchor_0)で次のように説明されているように挙動に違いはありません。

> 静的メンバー関数は、関数に暗黙の `this` ポインターがないため、インスタンス メンバーにアクセスできません。


CC BY-SA 4.0
2018-11-18T10:05:21.510
50415
2018-11-18T10:05:21.510
4236
50409
answer


  * `static` メンバ関数内からは `static` なメンバ変数・メンバ関数だけ使える
  * 非 `static` メンバ関数内からは両方使える

ということは、クラスベースなオブジェクト指向の、まあある意味根幹なわけです。これが当たり前だと思うか、疑問に思うか、でオブジェクト指向の理解度が試せたりします。

* * *

まず、同一クラスのインスタンスが複数個作れるというのが基礎中の基礎。  
複数あるインスタンスはすべて違う内容を保持できる/保持したい。  
が故に 非 `static` なメンバこそがクラスの本質です。

例：人間クラスのインスタンスであるAさんとBさんは違う人物である。ゆえに、メンバ変数「生年月日」の値、メンバ変数「姓名」の値、も、違う。たまたまメンバ変数「性別」の値が同じであることもあるかもしれない。違うことが本質なので、これらのメンバ変数はすべて「非
`static` 」である必然がある。

逆にいうと、非 `static`
なメンバは「誰」を特定しないと意味がありません。誰かを特定せずに性別や携帯番号や今日の年齢だけ問われても答えられません。Aさんの性別、Bさんの携帯番号なら意味があります。この「誰」が
`this` (python なら `self` )

[code]

    label1.Text = Properties.Resource.StartActionText;
    
[/code]

`label1` が「誰」（ `label1` の保持者つまり `Form1` が指定している）  
`Label.Text { set }` の中では「誰」は `this` つまり自分。

普通に「メンバ変数」「メンバ関数」という際には必ず `this` つまり、今注目している誰か、が必要です。外から見たら変数名、処理する関数の中では
`this` 。

* * *

`static`
メンバは「誰」を特定する必要がない、誰に聞いても同じ結果が返ってくる（がゆえに１つだけ存在すればそれでよい）というものです。人クラスで例を出すなら「性別が何種類あるか」「総人口は何人か」「平均寿命は何歳か」などなど。誰を特定する必要がない、すなわち
`this` が無いということです。

故に `static` メンバ関数の中では自クラスの `this` が必要な処理はできません。  
逆に非 `static` メンバ関数の中では `static` メンバを使うことができます。

* * *

ここまで納得できたら後は [c#](/questions/tagged/c%23 "'c#' のタグが付いた質問を表示")
の仕様として「プログラムの開始位置は `static` な `Main()` とする」と決められてしまったので、その中からは当該クラスの `static`
なメンバ変数が使えて、非 `static` なメンバ変数が使えないのは当たり前っす。


CC BY-SA 4.0
2018-11-19T01:15:33.467
50425
2018-11-19T01:15:33.467
8589
50409
answer