質問: new int[5] { 1, 2, 3, 4, 5 }; for (int i=0; i< num.Length; i++) { Console.WriteLine(num[i]); } Console.ReadKey(); } } ```
回答: * `static` メンバ関数内からは `static` なメンバ変数・メンバ関数だけ使える * 非 `static` メンバ関数内からは両方使える ということは、クラスベースなオブジェクト指向の、まあある意味根幹なわけです。これが当たり前だと思うか、疑問に思うか、でオブジェクト指向の理解度が試せたりします。 まず、同一クラスのインスタンスが複数個作れるというのが基礎中の基礎。 複数あるインスタンスはすべて違う内容を保持できる/保持したい。 が故に 非 `static` なメンバこそがクラスの本質です。 例:人間クラスのインスタンスであるAさんとBさんは違う人物である。ゆえに、メンバ変数「生年月日」の値、メンバ変数「姓名」の値、も、違う。たまたまメンバ変数「性別」の値が同じであることもあるかもしれない。違うことが本質なので、これらのメンバ変数はすべて「非 `static` 」である必然がある。 逆にいうと、非 `static` なメンバは「誰」を特定しないと意味がありません。誰かを特定せずに性別や携帯番号や今日の年齢だけ問われても答えられません。Aさんの性別、Bさんの携帯番号なら意味があります。この「誰」が `this` (python なら `self` ) ``` label1.Text = Properties.Resource.StartActionText; ``` `label1` が「誰」( `label1` の保持者つまり `Form1` が指定している) `Label.Text { set }` の中では「誰」は `this` つまり自分。 普通に「メンバ変数」「メンバ関数」という際には必ず `this` つまり、今注目している誰か、が必要です。外から見たら変数名、処理する関数の中では `this` 。 `static` メンバは「誰」を特定する必要がない、誰に聞いても同じ結果が返ってくる(がゆえに1つだけ存在すればそれでよい)というものです。人クラスで例を出すなら「性別が何種類あるか」「総人口は何人か」「平均寿命は何歳か」などなど。誰を特定する必要がない、すなわち `this` が無いということです。 故に `static` メンバ関数の中では自クラスの `this` が必要な処理はできません。 逆に非 `static` メンバ関数の中では `static` メンバを使うことができます。 ここまで納得できたら後は [c#](/questions/tagged/c%23 "'c#' のタグが付いた質問を表示") の仕様として「プログラムの開始位置は `static` な `Main()` とする」と決められてしまったので、その中からは当該クラスの `static` なメンバ変数が使えて、非 `static` なメンバ変数が使えないのは当たり前っす。