C# フィールド変数とブロックスコープの練習問題(模範解答&解説付き)
- 1. 1. 練習問題(全20問)
- 1.1. Q1. 次のコードの出力を予想してください
- 1.2. Q2.
for
ループの後にi
を使うとエラーになるのはなぜ? - 1.3. Q3. 次のコードはエラーになりますか?
- 1.4. Q4.
static
フィールドの特徴として正しいものはどれ? - 1.5. Q5.
readonly
フィールドはどこで値を設定できますか? - 1.6. Q6.
const
とreadonly
の違いは? - 1.7. Q7.
if
文のスコープについて正しい説明はどれか? - 1.8. Q8.
static
フィールドの値はインスタンスごとに異なる? - 1.9. Q9.
for
ループで定義した変数i
をループの外で使うには? - 1.10. Q10.
readonly
の正しい説明は? - 1.11. Q11.
static
メンバをインスタンスから呼び出すとどうなる? - 1.12. Q12.
readonly
フィールドの値を変更できるのは? - 1.13. Q13.
for
ループのスコープに関する正しい説明は? - 1.14. Q14.
if
ブロックのスコープを破るには? - 1.15. Q15.
const
の制約として正しいのは? - 1.16. Q16.
for
ループ内で宣言した変数を外で使うには? - 1.17. Q17.
const
の値は実行時に変更可能か? - 1.18. Q18.
readonly
フィールドの変更が許される場所は? - 1.19. Q19.
static
変数はどこで共有される? - 1.20. Q20.
const
とstatic readonly
の違いは?
- 2. 2. 練習問題の模範解答と解説
- 2.1. Q1. 次のコードの出力を予想してください
- 2.2. 解説
- 2.3. Q2.
for
ループの後にi
を使うとエラーになるのはなぜ? - 2.4. 解説
- 2.5. Q3. 次のコードはエラーになりますか?
- 2.6. 解説
- 2.7. Q4.
static
フィールドの特徴として正しいものはどれ? - 2.8. 解説
- 2.9. Q5.
readonly
フィールドはどこで値を設定できますか? - 2.10. 解説
- 2.11. Q6.
const
とreadonly
の違いは? - 2.12. 解説
- 2.13. Q7.
if
文のスコープについて正しい説明はどれか? - 2.14. Q8.
static
フィールドの値はインスタンスごとに異なる? - 2.15. Q9.
for
ループで定義した変数i
をループの外で使うには? - 2.16. Q10.
readonly
の正しい説明は? - 2.17. Q11.
static
メンバをインスタンスから呼び出すとどうなる? - 2.18. Q12.
readonly
フィールドの値を変更できるのは? - 2.19. Q13.
for
ループのスコープに関する正しい説明は? - 2.20. Q14.
if
ブロックのスコープを破るには? - 2.21. Q15.
const
の制約として正しいのは? - 2.22. Q16.
for
ループ内で宣言した変数を外で使うには? - 2.23. Q17.
const
の値は実行時に変更可能か? - 2.24. Q18.
readonly
フィールドの変更が許される場所は? - 2.25. Q19.
static
変数はどこで共有される? - 2.26. Q20.
const
とstatic readonly
の違いは?
- 3. 3. まとめ
1. 練習問題(全20問)
フィールド変数とブロックスコープの理解を深めるための 20問 を用意しました。
Q1. 次のコードの出力を予想してください
using System;
class Sample
{
int num = 10;
void Show()
{
int num = 20;
Console.WriteLine(num);
}
static void Main()
{
Sample s = new Sample();
s.Show();
}
}
10
20
エラーになる
コンパイルできない
Q2. for
ループの後に i
を使うとエラーになるのはなぜ?
using System;
class Program
{
static void Main()
{
for (int i = 0; i < 3; i++)
{
Console.WriteLine(i);
}
Console.WriteLine(i); // ここでエラー
}
}
i
はstatic
変数ではないからi
はfor
ループのブロックスコープ内にあるからi
はreadonly
だからfor
の外にi
が宣言されていないから
Q3. 次のコードはエラーになりますか?
using System;
class Program
{
static void Main()
{
{
int x = 10;
}
Console.WriteLine(x);
}
}
10
が表示されるエラーになる
何も表示されない
プログラムが停止する
Q4. static
フィールドの特徴として正しいものはどれ?
- インスタンスごとに異なる値を持つ
- クラス全体で1つだけ存在する
const
のように変更できないreadonly
フィールドと同じ
Q5. readonly
フィールドはどこで値を設定できますか?
- メソッドの中
- コンストラクタ
- クラス外部
- どこでも設定可能
Q6. const
と readonly
の違いは?
- どちらもコンストラクタで変更可能
const
はコンパイル時に値が決まるreadonly
は一度だけ変更可能だがconst
は変更不可- 2 と 3 の両方
Q7. if
文のスコープについて正しい説明はどれか?
using System;
class Program
{
static void Main()
{
if (true)
{
int num = 100;
}
Console.WriteLine(num);
}
}
100
が表示されるnum
は if 文のブロックスコープ内にあるから、エラーになる何も表示されない
プログラムが停止する
Q8. static
フィールドの値はインスタンスごとに異なる?
- はい、各インスタンスごとに異なる値を持つ
- いいえ、すべてのインスタンスで共通の値を持つ
readonly
フィールドと同じconst
フィールドと同じ
Q9. for
ループで定義した変数 i
をループの外で使うには?
using System;
class Program
{
static void Main()
{
for (int i = 0; i < 3; i++)
{
Console.WriteLine(i);
}
Console.WriteLine(i); // ここでエラー
}
}
次のうち、i
を for
の外でも使えるようにする適切な修正は?
for
ループの外でi
を宣言するi
をstatic
にするi
をreturn
で返すi
をreadonly
にする
Q10. readonly
の正しい説明は?
const
と同じく変更不可実行時に何度でも変更可能
実行時に1度だけ設定可能
値はコンパイル時に決まる
Q11. static
メンバをインスタンスから呼び出すとどうなる?
- インスタンスごとに異なる値を持つ
- クラス名を使わないとエラーになる
- どのインスタンスからもアクセスできる
readonly
と同じ
Q12. readonly
フィールドの値を変更できるのは?
- メソッドの中
- コンストラクタ内
- クラス外部
static
メソッド内
Q13. for
ループのスコープに関する正しい説明は?
- ループ内で定義した変数はどこでも使える
- ループの前後で変数は保持される
{}
の外では変数は無効- ループの外で変数を宣言しても影響はない
Q14. if
ブロックのスコープを破るには?
- 変数を if の外で宣言する
static
をつけるreadonly
にするconst
にする
Q15. const
の制約として正しいのは?
- 実行時に変更可能
readonly
よりも自由に変更できる- メソッド内で定義できる
- 実行時に変更不可
Q16. for
ループ内で宣言した変数を外で使うには?
- ループの外で変数を宣言する
const
を使うstatic
を使うreadonly
を使う
Q17. const
の値は実行時に変更可能か?
- はい、
readonly
と同じ - いいえ、コンパイル時に決まるため不可
- メソッド内なら変更可能
static
なら変更可能
Q18. readonly
フィールドの変更が許される場所は?
- クラス外部
- クラス内部のどこでも
- コンストラクタ内
- メソッド内
Q19. static
変数はどこで共有される?
- インスタンスごとに異なる
- クラス全体で1つだけ存在する
readonly
フィールドと同じconst
と同じ
Q20. const
と static readonly
の違いは?
const
はコンパイル時、readonly
は実行時に決まる- どちらも変更可能
- どちらも変更不可
readonly
はstatic
にできない
以上が 20問の練習問題 です!
次に、これらの問題の 模範解答&解説 を用意します。
2. 練習問題の模範解答と解説
Q1. 次のコードの出力を予想してください
✅ 正解:
2. 20
解説
- メソッド内で宣言された
num
はローカル変数であり、フィールド変数num
とは異なる。 - ローカル変数
num
が優先されるため、Show()
を実行すると20
が表示される。
Q2. for
ループの後に i
を使うとエラーになるのはなぜ?
✅ 正解:
2. i
は for
ループのブロックスコープ内にあるから
解説
i
のスコープはfor
ループの{}
内 に限定される。- したがって、ループが終了した後には
i
は無効になり、エラーが発生する。 - 修正方法:
i
をfor
の外で宣言する。
Q3. 次のコードはエラーになりますか?
✅ 正解: 2. エラーになる
解説
x
は{}
内で定義されており、その外では無効になる。Console.WriteLine(x);
の行でエラーが発生する。- 修正方法:
x
をブロックの外で宣言する。
Q4. static
フィールドの特徴として正しいものはどれ?
✅ 正解: 2. クラス全体で1つだけ存在する
解説
static
フィールドは クラス全体で1つだけ存在 し、すべてのインスタンスで共有される。
Q5. readonly
フィールドはどこで値を設定できますか?
✅ 正解: 2. コンストラクタ
解説
readonly
フィールドは、コンストラクタまたは初期化時のみ値を設定できる。- 一度設定したら変更できない。
Q6. const
と readonly
の違いは?
✅ 正解:
4. const
はコンパイル時に値が決まる、readonly
は実行時に初期化可能
解説
比較項目 | const | readonly |
---|---|---|
値の決定タイミング | コンパイル時 | 実行時 |
変更できるか? | 変更不可 | コンストラクタでのみ変更可能 |
static か? | 自動で static | static でない(static readonly なら可能) |
Q7. if
文のスコープについて正しい説明はどれか?
✅ 正解:
2. num
は if 文のブロックスコープ内にあるから、エラーになる
Q8. static
フィールドの値はインスタンスごとに異なる?
✅ 正解: 2. すべてのインスタンスで共通の値を持つ
Q9. for
ループで定義した変数 i
をループの外で使うには?
✅ 正解:
1. i
を for
の外で宣言する
修正後のコード
using System;
class Program
{
static void Main()
{
int i; // ループの外で変数を宣言
for (i = 0; i < 3; i++)
{
Console.WriteLine(i);
}
Console.WriteLine($"ループの後の i: {i}"); // OK
}
}
解説
for
の中でint i
を宣言すると、そのスコープは ループの{}
内のみに限定 されるため、ループ外ではエラー になる。- ループの外で
i
を宣言すると、ループが終了してもi
を使用できるようになる。 static
にする必要はない(選択肢 2 は不適切)。return
で返す方法はスコープを広げるわけではない(選択肢 3 は不適切)。readonly
は値の変更を禁止するだけであり、スコープを変更しない(選択肢 4 は不適切)。
Q10. readonly
の正しい説明は?
✅ 正解: 3. 実行時に1度だけ設定可能
Q11. static
メンバをインスタンスから呼び出すとどうなる?
✅ 正解: 2. クラス名を使わないとエラーになる
Q12. readonly
フィールドの値を変更できるのは?
✅ 正解: 2. コンストラクタ内
Q13. for
ループのスコープに関する正しい説明は?
✅ 正解:
3. {}
の外では変数は無効
Q14. if
ブロックのスコープを破るには?
✅ 正解: 1. 変数を if の外で宣言する
Q15. const
の制約として正しいのは?
✅ 正解: 4. 実行時に変更不可
Q16. for
ループ内で宣言した変数を外で使うには?
✅ 正解: 1. ループの外で変数を宣言する
Q17. const
の値は実行時に変更可能か?
✅ 正解: 2. いいえ、コンパイル時に決まるため不可
Q18. readonly
フィールドの変更が許される場所は?
✅ 正解: 3. コンストラクタ内
Q19. static
変数はどこで共有される?
✅ 正解: 2. クラス全体で1つだけ存在する
Q20. const
と static readonly
の違いは?
✅ 正解:
1. const
はコンパイル時、readonly
は実行時に決まる
3. まとめ
スコープの種類 | 有効範囲 | 特徴 |
---|---|---|
フィールド変数 | クラス全体 | クラスのすべてのメソッドからアクセス可能 |
ローカル変数 | メソッド内 | メソッドが終了すると消える |
ブロックスコープ | {} 内のみ | {} の外では使えない |
static 変数 | クラス全体 | インスタンス間で共通の値を持つ |
✅ フィールド変数はクラス全体でアクセス可能
✅ ブロックスコープは {}
内で有効
✅ static
変数はクラスで1つのみ
✅ readonly
は実行時に1度だけ設定可能
✅ const
はコンパイル時に決定される
これで、C# のスコープの概念をしっかり理解できます! 🚀
ディスカッション
コメント一覧
まだ、コメントがありません