C# フィールド変数とブロックスコープの練習問題(模範解答&解説付き)


目次

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();
    }
}
  1. 10
  2. 20
  3. エラーになる
  4. コンパイルできない

Q2. for ループの後に i を使うとエラーになるのはなぜ?

using System;

class Program
{
    static void Main()
    {
        for (int i = 0; i < 3; i++)
        {
            Console.WriteLine(i);
        }
        Console.WriteLine(i); // ここでエラー
    }
}
  1. istatic 変数ではないから
  2. ifor ループのブロックスコープ内にあるから
  3. ireadonly だから
  4. for の外に i が宣言されていないから

Q3. 次のコードはエラーになりますか?

using System;

class Program
{
    static void Main()
    {
        {
            int x = 10;
        }
        Console.WriteLine(x);
    }
}
  1. 10 が表示される
  2. エラーになる
  3. 何も表示されない
  4. プログラムが停止する

Q4. static フィールドの特徴として正しいものはどれ?

  1. インスタンスごとに異なる値を持つ
  2. クラス全体で1つだけ存在する
  3. const のように変更できない
  4. readonly フィールドと同じ

Q5. readonly フィールドはどこで値を設定できますか?

  1. メソッドの中
  2. コンストラクタ
  3. クラス外部
  4. どこでも設定可能

Q6. constreadonly の違いは?

  1. どちらもコンストラクタで変更可能
  2. const はコンパイル時に値が決まる
  3. readonly は一度だけ変更可能だが const は変更不可
  4. 2 と 3 の両方

Q7. if 文のスコープについて正しい説明はどれか?

using System;

class Program
{
    static void Main()
    {
        if (true)
        {
            int num = 100;
        }
        Console.WriteLine(num);
    }
}
  1. 100 が表示される
  2. num は if 文のブロックスコープ内にあるから、エラーになる
  3. 何も表示されない
  4. プログラムが停止する

Q8. static フィールドの値はインスタンスごとに異なる?

  1. はい、各インスタンスごとに異なる値を持つ
  2. いいえ、すべてのインスタンスで共通の値を持つ
  3. readonly フィールドと同じ
  4. 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 の外でも使えるようにする適切な修正は?

  1. for ループの外で i を宣言する
  2. i を static にする
  3. i を return で返す
  4. i を readonly にする

Q10. readonly の正しい説明は?

  1. const と同じく変更不可
  2. 実行時に何度でも変更可能
  3. 実行時に1度だけ設定可能
  4. 値はコンパイル時に決まる

Q11. static メンバをインスタンスから呼び出すとどうなる?

  1. インスタンスごとに異なる値を持つ
  2. クラス名を使わないとエラーになる
  3. どのインスタンスからもアクセスできる
  4. readonly と同じ

Q12. readonly フィールドの値を変更できるのは?

  1. メソッドの中
  2. コンストラクタ内
  3. クラス外部
  4. static メソッド内

Q13. for ループのスコープに関する正しい説明は?

  1. ループ内で定義した変数はどこでも使える
  2. ループの前後で変数は保持される
  3. {} の外では変数は無効
  4. ループの外で変数を宣言しても影響はない

Q14. if ブロックのスコープを破るには?

  1. 変数を if の外で宣言する
  2. static をつける
  3. readonly にする
  4. const にする

Q15. const の制約として正しいのは?

  1. 実行時に変更可能
  2. readonly よりも自由に変更できる
  3. メソッド内で定義できる
  4. 実行時に変更不可

Q16. for ループ内で宣言した変数を外で使うには?

  1. ループの外で変数を宣言する
  2. const を使う
  3. static を使う
  4. readonly を使う

Q17. const の値は実行時に変更可能か?

  1. はい、readonly と同じ
  2. いいえ、コンパイル時に決まるため不可
  3. メソッド内なら変更可能
  4. static なら変更可能

Q18. readonly フィールドの変更が許される場所は?

  1. クラス外部
  2. クラス内部のどこでも
  3. コンストラクタ内
  4. メソッド内

Q19. static 変数はどこで共有される?

  1. インスタンスごとに異なる
  2. クラス全体で1つだけ存在する
  3. readonly フィールドと同じ
  4. const と同じ

Q20. conststatic readonly の違いは?

  1. const はコンパイル時、readonly は実行時に決まる
  2. どちらも変更可能
  3. どちらも変更不可
  4. readonlystatic にできない

以上が 20問の練習問題 です!
次に、これらの問題の 模範解答&解説 を用意します。

2. 練習問題の模範解答と解説


Q1. 次のコードの出力を予想してください

正解: 2. 20

解説

  • メソッド内で宣言された num はローカル変数であり、フィールド変数 num とは異なる。
  • ローカル変数 num が優先されるため、Show() を実行すると 20 が表示される。

Q2. for ループの後に i を使うとエラーになるのはなぜ?

正解: 2. ifor ループのブロックスコープ内にあるから

解説

  • i のスコープは for ループの {} に限定される。
  • したがって、ループが終了した後には i は無効になり、エラーが発生する。
  • 修正方法: ifor の外で宣言する。

Q3. 次のコードはエラーになりますか?

正解: 2. エラーになる

解説

  • x{} 内で定義されており、その外では無効になる。
  • Console.WriteLine(x); の行でエラーが発生する。
  • 修正方法: x をブロックの外で宣言する。

Q4. static フィールドの特徴として正しいものはどれ?

正解: 2. クラス全体で1つだけ存在する

解説

  • static フィールドは クラス全体で1つだけ存在 し、すべてのインスタンスで共有される。

Q5. readonly フィールドはどこで値を設定できますか?

正解: 2. コンストラクタ

解説

  • readonly フィールドは、コンストラクタまたは初期化時のみ値を設定できる。
  • 一度設定したら変更できない。

Q6. constreadonly の違いは?

正解: 4. const はコンパイル時に値が決まる、readonly は実行時に初期化可能

解説

比較項目constreadonly
値の決定タイミングコンパイル時実行時
変更できるか?変更不可コンストラクタでのみ変更可能
static か?自動で staticstatic でないstatic readonly なら可能)

Q7. if 文のスコープについて正しい説明はどれか?

正解: 2. num は if 文のブロックスコープ内にあるから、エラーになる


Q8. static フィールドの値はインスタンスごとに異なる?

正解: 2. すべてのインスタンスで共通の値を持つ


Q9. for ループで定義した変数 i をループの外で使うには?

正解: 1. ifor の外で宣言する

修正後のコード

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. conststatic readonly の違いは?

正解: 1. const はコンパイル時、readonly は実行時に決まる


3. まとめ

スコープの種類有効範囲特徴
フィールド変数クラス全体クラスのすべてのメソッドからアクセス可能
ローカル変数メソッド内メソッドが終了すると消える
ブロックスコープ{} 内のみ{} の外では使えない
static 変数クラス全体インスタンス間で共通の値を持つ

フィールド変数はクラス全体でアクセス可能
ブロックスコープは {} 内で有効
static 変数はクラスで1つのみ
readonly は実行時に1度だけ設定可能
const はコンパイル時に決定される


これで、C# のスコープの概念をしっかり理解できます! 🚀

C#,変数

Posted by hidepon