第5章: メソッドとスコープ

csharp-methods-and-scope-guide

メソッドは、プログラムを細かく分割し、再利用可能な形にまとめるための基本的な単位です。例えば、「2つの数を足す」や「画面にメッセージを表示する」といった処理をメソッドに分けることで、プログラム全体が分かりやすくなり、同じ処理を何度も簡単に呼び出すことができるようになります。また、メソッド内で使う変数には「スコープ」という有効範囲があります。この章では、メソッドの使い方やパラメーターの種類、スコープの基本について詳しく学びましょう。

5.1 メソッドの定義と基本的な使用法

メソッドを使うと、プログラムを繰り返し呼び出すことができます。メソッドには、「名前」、「戻り値の型」、「パラメーター」、「メソッド本体」の4つの要素があります。

メソッドの基本構文

public static int Add(int a, int b)
{
    return a + b;
}

解説

public: アクセス修飾子で、このメソッドがどこからでも呼び出せることを示します。

static: メソッドをインスタンス化せずに呼び出すためのキーワードです。

int: メソッドの戻り値の型です。この場合、Addメソッドは整数を返します。

Add: メソッド名です。処理内容をわかりやすく表現する名前をつけるのが良い習慣です。

(int a, int b): メソッドに渡す引数のリストです。ここでは、整数型のabを受け取るようにしています。

return a + b;: メソッドの実行結果を呼び出し元に返します。

例えば、このメソッドを呼び出す際にAdd(3, 5)とすれば、aには3、bには5が渡され、結果の8が返されます。

メソッドを呼び出す例

int result = Add(3, 5);
Console.WriteLine(result); // 出力: 8

5.2 メソッドの引数と戻り値

メソッドにデータを渡すためのものが「引数」で、処理結果を返すものが「戻り値」です。引数の渡し方や戻り値の扱い方について詳しく見ていきます。

引数の種類と使い方

1. 値渡し: 引数として渡された値はメソッド内でコピーされるため、メソッド内で値を変更しても元の変数には影響しません。

public static void ShowNumber(int num)
{
    num = 10;
    Console.WriteLine(num); // 出力: 10
}

int number = 5;
ShowNumber(number);
Console.WriteLine(number); // 出力: 5

– この例では、numberの値がShowNumberメソッドに渡されますが、メソッド内でnumの値を変更しても、元の変数numberには影響しません。

2. 参照渡し (ref): 引数として変数そのものをメソッドに渡します。メソッド内での変更は、元の変数に影響します。

public static void Increment(ref int num)
{
    num++;
}

int number = 5;
Increment(ref number);
Console.WriteLine(number); // 出力: 6

refキーワードを使うと、変数の参照を渡すため、Incrementメソッド内での変更が呼び出し元のnumberにも反映されます。

– 注意点: refを使う場合、メソッドを呼び出す前に引数を初期化しておく必要があります。

3. 出力引数 (out): メソッドが複数の値を返す必要があるときに使用します。out引数は、メソッド内で必ず値を設定する必要があります。

public static void Divide(int a, int b, out int quotient, out int remainder)
{
    quotient = a / b;
    remainder = a % b;
}

int q, r;
Divide(10, 3, out q, out r);
Console.WriteLine($"商: {q}, 余り: {r}"); // 出力: 商: 3, 余り: 1

out引数は、メソッドから複数の結果を返すのに便利です。

– 呼び出し元でDivideメソッドを呼ぶ際、outキーワードを使って結果を受け取ります。

4. 可変長引数 (params): 任意の数の引数を受け取りたいときに使用します。引数の数が不定の場合に便利です。

public static int Sum(params int[] numbers)
{
    int total = 0;
    foreach (int num in numbers)
    {
        total += num;
    }
    return total;
}

int sum = Sum(1, 2, 3, 4);
Console.WriteLine(sum); // 出力: 10

paramsキーワードを使うと、引数を配列として受け取ることができ、任意の数の引数を渡すことが可能です。

戻り値

メソッドの戻り値は、return文を使って返します。戻り値がない場合は、戻り値の型をvoidにします。

public static void ShowMessage()
{
    Console.WriteLine("Hello, World!");
}

– このメソッドは戻り値を持たないため、戻り値の型をvoidにしています。

5.3 パラメーター修飾子 (ref, out, params)

パラメーター修飾子は、メソッドにデータを渡す方法を変えるものです。

ref: 参照渡しで変数を渡します。呼び出し前に変数を初期化しておく必要があります。

out: 参照渡しですが、呼び出し前に変数の初期化は不要です。ただし、メソッド内で必ず値を設定しなければなりません。

params: 可変長引数を渡すための修飾子です。引数の数が不定の場合に使用します。

5.4 メソッドのオーバーロード

メソッドのオーバーロードは、同じ名前で異なるパラメーターリストのメソッドを複数定義することです。これにより、同じ機能を持つメソッドを異なるデータ型やパラメーターの数に対応させることができます。

public static int Multiply(int a, int b)
{
    return a * b;
}

public static double Multiply(double a, double b)
{
    return a * b;
}

public static int Multiply(int a, int b, int c)
{
    return a * b * c;
}

解説

– ここでは、Multiplyメソッドが3つあります。それぞれ引数の型や数が異なります。

– コンパイラは、呼び出し時に引数の型と数を基に、適切なメソッドを選択します。

– 例: Multiply(2, 3)は整数を受け取るメソッドが呼ばれ、Multiply(2.5, 3.0)double型を受け取るメソッドが呼ばれます。

5.5 ローカル変数のスコープと生存期間

スコープとは、変数が使える範囲のことです。変数が定義された場所によって、その変数のスコープが決まります。

1. メソッドスコープ: メソッド内で定義された変数は、そのメソッド内でのみ使用できます。メソッドが終了すると、メモリから削除されます。

public static void ShowScope()
{
    int x = 10; // xはShowScopeメソッド内でのみ有効
    Console.WriteLine(x);
}

2. ブロックスコープ: {}で囲まれたブロック内で定義された変数は、そのブロック内でのみ有効です。

public static void CheckScope()
{
    if (true)
    {
        int y = 5; // yはifブロック内でのみ有効
        Console.WriteLine(y);
    }
    // Console.WriteLine(y); // エラー: yはこの範囲では存在しない
}

異常パターンの例

public static void ScopeExample()
{
    int x = 10;
    {
        int x = 20; // エラー: 同じスコープ内で同じ名前の変数を再定義することはできない
    }
}

– この例では、内側のブロックでxを再定義しようとしているため、コンパイルエラーが発生します。同じスコープ内で同じ名前の変数を定義することはできません。

まとめ

この章では、C#のメソッドとスコープについて詳しく学びました。メソッドの定義と呼び出しの基本、引数の使い方(値渡し、参照渡し、出力引数、可変長引数)、メソッドのオーバーロード、そして変数のスコープについて理解できたと思います。これらの知識を使うことで、プログラムをより柔軟かつ効率的に書くことができます。メソッドを上手に使いこなすことで、コードの再利用性が高まり、より見やすく保守しやすいプログラムを作ることができるでしょう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次