演習 - メソッドスコープを理解する

完了

for ループ、 if-else ステートメント、およびメソッドはすべて、さまざまな種類のコード ブロックを表します。 各コード ブロックには、独自の 'scope' があります。 'Scope' は、特定のデータにアクセスできるプログラムのリージョンです。 メソッドまたは任意のコード ブロック内で宣言された変数には、そのリージョン内でのみアクセスできます。 プログラムがより複雑になるにつれて、このパターンはプログラマが一貫して明確な名前の変数を使用し、読みやすいコードを維持するのに役立ちます。

この演習では、さまざまな種類のメソッドと変数を使用して、メソッドスコープの詳細を学習します。

変数スコープをテストする

コード ブロックの外部で宣言されたステートメントは、最上位レベルのステートメントと呼ばれます。 最上位レベルのステートメントで宣言された変数は、"グローバル変数" と呼ばれます。 グローバル変数はどのスコープにも制限されず、プログラム全体のどこでも使用できます。 グローバル変数は、同じデータにアクセスする必要があるさまざまなメソッドに役立ちます。 ただし、さまざまなスコープ内の変数名に注意することが重要です。

  1. Visual Studio Code エディターで、前の演習の既存のコードを削除します。

  2. Visual Studio Code エディターに次のコードを入力します。

    string[] students = {"Jenna", "Ayesha", "Carlos", "Viktor"};
    
    DisplayStudents(students);
    DisplayStudents(new string[] {"Robert","Vanya"});
    
    void DisplayStudents(string[] students) 
    {
        foreach (string student in students) 
        {
            Console.Write($"{student}, ");
        }
        Console.WriteLine();
    }
    

    このコードでは、グローバル students 配列と、同じ名前のパラメーターを受け取るメソッド DisplayStudents を作成します。

  3. コードを保存して実行し、次の出力を確認します。

    Jenna, Ayesha, Carlos, Viktor, 
    Robert, Vanya, 
    

    メソッド パラメーター student がグローバル student 配列よりも優先されます。 メソッドで使用するグローバル変数について慎重に検討することが重要です。

  4. 前のコードを削除します。

  5. 以下のコードをエディターに貼り付けます。

    PrintCircleArea(12);
    
    void PrintCircleArea(int radius)
    {
        double pi = 3.14159;
        double area = pi * (radius * radius);
        Console.WriteLine($"Area = {area}");
    }
    

    このコードは、円の面積を計算して表示します。

  6. コードを次のように更新して、 PrintCircleArea メソッド内の変数の参照を試みます。

    PrintCircleArea(12);
    double circumference = 2 * pi * radius;
    

    現在のスコープに名前piradiusが存在しないことを示すエラー メッセージが表示されます。 これらの変数は、 PrintCircleArea メソッドスコープ内にのみ存在します。

  7. 正しくないコードを削除し、次のコードを追加します。

    void PrintCircleCircumference(int radius)
    {
        double pi = 3.14159;
        double circumference = 2 * pi * radius;
        Console.WriteLine($"Circumference = {circumference}");
    }
    

    変数 pi は同じ固定値に設定され、両方のメソッドで使用されるため、この値はグローバル変数に適しています。 この例では、 radius はグローバル変数ではないので、毎回変数を更新することなく、 radius の異なる値を持つメソッドを呼び出すことができます。

  8. コードを次のように更新します。

    double pi = 3.14159;
    
    void PrintCircleArea(int radius)
    {
        double area = pi * (radius * radius);
        Console.WriteLine($"Area = {area}");
    }
    
    void PrintCircleCircumference(int radius)
    {
        double circumference = 2 * pi * radius;
        Console.WriteLine($"Circumference = {circumference}");
    }
    

    これで、両方のメソッドが同じ値の pi を定義しなくても参照できるようになりました。 メソッドが他のメソッドを呼び出すことができると既に推測している可能性があります。 一般に、プログラムのスコープ内でメソッドが定義されている限り、任意の場所で呼び出すことができます。

  9. 次のように、コードに新しいメソッドを追加します。

    double pi = 3.14159;
    PrintCircleInfo(12);
    PrintCircleInfo(24);
    
    void PrintCircleInfo(int radius) 
    {
        Console.WriteLine($"Circle with radius {radius}");
        PrintCircleArea(radius);
        PrintCircleCircumference(radius);
    }
    

    このコードでは、既存のメソッドを呼び出す PrintCircleInfo 新しいメソッドを作成します。 radiusの値も各メソッドに渡されます。 モジュール化されたメソッドを作成すると、コードを整理して読みやすくすることができます。

  10. コードを保存して実行し、次の出力を確認します。

    Circle with radius 12
    Area = 452.38896
    Circumference = 75.39815999999999
    Circle with radius 24
    Area = 1809.55584
    Circumference = 150.79631999999998
    

まとめ

これまでにメソッド スコープについて学習した内容を次に示します。

  • メソッド内で宣言された変数には、そのメソッドのみがアクセスできます。
  • 最上位レベルのステートメントで宣言された変数には、プログラム全体でアクセスできます。
  • メソッドは、異なるメソッド内で定義された変数にアクセスできません。
  • メソッドは他のメソッドを呼び出すことができます。