- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C#での変数スコープ?)
C#の変数スコープについて
このQ&Aのポイント
- C#のNet 2.0で同一名の変数を使う場合、変数スコープによって挙動が異なる。
- Hoge1ではローカルの変数 'x' を宣言することができず、'親またはカレント' スコープの変数としての 'x' の意味が変更される。
- 一方、Hoge2では再宣言することでローカル変数としての 'x' を宣言でき、'親またはカレント' スコープの変数には影響を与えない。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>変化があったのでしょうか? 質問文で掲示されているページの記事と、質問者さんの例(ほげ1ほげ2)は、表記は違えど「同じ事を言っている」ように見えるんですが。 「何も変わってない」と思いますが、どうでしょう?
その他の回答 (1)
- Wr5
- ベストアンサー率53% (2173/4061)
回答No.1
詳しいって訳ではありませんが……。 # ということで、正しい内容についてはもっと詳しい方の回答待ちになりますかな。 >int x = 2; // これはNG!。 エラーで書かれているように、Hoge1()直下でのローカル変数なのか、その下に作ったローカルなブロック内での変数なのか判別する手段がない(あるいは煩雑過ぎる)ので駄目なのでしょう。 >int x=1; //これはOK!親にぶらさげた変数が通る。 静的メソッドから、非静的クラスフィールド(int x;)へのアクセスはできませんから判別できない。という状況にはならないのでしょう。
質問者
お礼
ご回答ありがとうございます。 int x; private void Hoge2() { int x = 1; //このぶらさげ変数はOK! } とstaticをはずしても、相変わらず//ぶらさげ変数はOK!となる模様であります。。
お礼
ご回答ありがとうございます。 //http://www.atmarkit.co.jp/ait/articles/0210/16/news001_5.html からのコピペ改変(xをyに変更) private static int y = 0; static void sample1() { int y = 2; // ローカルの変数 'x' をこのスコープで宣言することはできません。これは、'親またはカレント' スコープで別の意味を持つ 'x' の意味が変更されるのを避けるためです。 } 上記を、VisualStudio2012でコピペで動かしてもやはりエラーが発生しないのであります...... ------------------------------------------------------------------ その後、自分でも検討した結果、以下のことが分かったので後学のために記述します。 public class Class1 { private void Hoge1() { int x; { int x = 2; // これはNG!。「ローカルの変数 'x' をこのスコープで宣言することはできません。これは、'親またはカレント' スコープで別の意味を持つ 'x' の意味が変更されるのを避けるためです。」といわれる。 } } int x; private void Hoge2() { int x = 1; //このぶらさげ変数はOK! } (1)Hoge2の{ }内のint x = 1;のxは{ }内のみにスコープを持つローカル変数として宣言されており、親のint x;とは無関係でスコープは及んでいない。→これは理解できる仕様である。 (2)ところが、Hoge2の{ }内のint x = 1;実行直後、親のint xにマウスをホーバーさせて内容をクイックウォッチすると1がはいってる(ように見えるため)、スコープが親のint xに通ってる(ように見える)!!→「え’’~、おかっしいなぁ」と感じる。 (3)これは、クイックウォッチが変数名のみで判断して中身表示してるためのようで、イミディエイトウインドウでClass1.xをみるとnullのままである。したがって、Hoge2の{ }内のローカル変数xのスコープは、親のxに及んでいないことがわかる。 ------------------------------------------------------------------ 上記より、 a)クイックウォッチの仕様にやや問題があるのでは? b)昔の文法のほうが厳格で、親にぶら下げたglobal的変数名をローカルで宣言してまったときに気づきやすい。よって、今の文法でも「ローカルの変数 'x' をこのスコープで宣言することはできるが、'親またはカレント' スコープでも同一名で宣言されてるが、わかってるんだろうな!」くらいの警告がほしい。