説明:メソッドの基礎

 メソッドとはプログラムの処理を1まとめにして名前を付けたものです。

シンプルなメソッド例

 下のコードはメソッドを利用しない場合の書き方です。

// メソッドを使わない場合

// 文字を出力した後は一行改行するという処理を考える
Console.WriteLine("Sample");
Console.WriteLine();

Console.WriteLine("Sample");
Console.WriteLine();

Console.WriteLine("Sample");
Console.WriteLine();

// 3回出力したい場合同じコードが繰り返し書かれることになる。
// もし文字出力後の改行を1行から2行に変更する場合、
// 3か所に変更を加えないといけない

  メソッドを使うと以下のように書き換えることができます。

public static void Main(string[] args)
{
    // メソッドを使用した場合

    // PrintAndLineメソッドの呼び出し
    // メソッドが呼ばれると処理は下部の
    // private static void PrintAndLine()から始まる行に移る
    PrintAndLine();
    PrintAndLine();
    PrintAndLine();
}

// メソッドの宣言(または定義)
public static void PrintAndLine()
{
    Console.WriteLine("Sample");
    Console.WriteLine();
            
    // 改行を追加したい場合はここに1行追加すればよい
    Console.WriteLine();

    // メソッドの処理が終わると呼び出し元に戻る
}

 新しくPrintAndLineという画面に出力して改行を行うメソッドを追加しました。

 ここで出てくる「public」「static」という用語はクラスの項目で説明されます。変数から順番に学ばれる場合は「メソッドの左に必要なもの」と読み飛ばしてください。

 MainメソッドではPrintAndLineというメソッドを呼び出しています。

// メソッドの呼び出し
PrintAndLine();

 メソッドを呼び出すとメソッドの中のコードが実行されます。

public static void PrintAndLine()
{
    // メソッドを呼び出すとこのコードが実行される。
    Console.WriteLine("Sample");
    Console.WriteLine();
            
    // 改行を追加したい場合はここに1行追加すればよい
    Console.WriteLine();
}

 メソッドの中のコードを複数回実行したい場合、以下のように呼び出しを複数回行います。

// 同じメソッドを3回呼び出す
PrintAndLine();
PrintAndLine();
PrintAndLine();

 「定義(または宣言)」と「呼び出し」の2つは書き方を含め混同しやすいので注意しましょう。

メソッドの引数

 先述の例では画面の出力する文字は全て「Sample」でした。

 それでは毎回違う文字を出力する以下のコードはメソッドに置き換えることができるでしょうか?

// 出力が毎回異なる文字列の場合
Console.WriteLine("One");
Console.WriteLine();

Console.WriteLine("Two");
Console.WriteLine();

Console.WriteLine("Three");
Console.WriteLine();

  この場合、メソッドの引数を利用します。

  引数を使えば、呼び出し側からメソッドに値を渡すことができます。

// メソッドに引数として値を渡して呼び出す
PrintAndLine("One");
PrintAndLine("Two");
PrintAndLine("Three");

  呼び出し側はメソッド名の後の()の中に引数として渡したい値を記述します。

  変数を渡すこともできます。その場合()の中には変数名を記述します。

// メソッドに引数として値を渡して呼び出す
string str1 = "One";
string str2 = "Two";
string str3 = "Three";

// メソッドの引数に変数を指定する
PrintAndLine(str1);
PrintAndLine(str2);
PrintAndLine(str3);

 引数を渡す場合、宣言(定義)側も対応したものに書き換える必要があります。

// 引数はメソッド名の右側の()に記述する
// [型] [変数名]という変数宣言であることに注意
private static void PrintAndLine(string str)
{
    Console.WriteLine(str);
    Console.WriteLine();
    Console.WriteLine();
}

 上のコードが引数を1つ追加したコードです。

 メソッド名PrintAndLineの右側の()の中に変数の宣言が1つ追記されています。この変数に呼び出し時に渡した値が代入されます。

 ここで注意したいのは呼び出し側と異なり[型] [変数名]という宣言の書式である点です。

 呼び出し側で渡された値(変数名str1など)が、メソッドの()内で宣言された変数に代入されるという処理をイメージすると書き方に迷わないでしょう。

// メソッドの引数の書き方の覚え方(イメージ)
// =の左側がメソッドの宣言内で用意された変数[型] [変数名]
// =の右側は呼び出し側で渡された値
string str = str1;

メソッドの戻り値(または返り値)

 メソッド内で処理を行った結果を呼び出し側で受け取りたい場合はどうすればよいでしょうか?

public static void Main(string[] args)
{
    // メソッドの呼び出し
    // 結果を受け取りたい
    Add(4, 6);
}

public static void Add(int a, int b)
{
    // メソッド内で加算した結果を呼び出し元に戻したい
    int result = a + b;
}

 Addメソッド内で宣言した変数resultにはスコープ(有効範囲)があり、その範囲はメソッドAddメソッド内のみです。

 そのためMainメソッドで変数resultの値を使うことができません。

 メソッドから処理結果を受け取りたい場合は「戻り値(または返り値)」を使用します。

 まずはコードを見てみましょう。

public static void Main(string[] args)
{
    // 戻り値は代入記号(=)の左辺に変数を記述することで受け取れる
    int sum = Add(4, 6);
}

// 戻り値のあるメソッドメソッド名(Add)の左側に戻り値の型を記述
public static int Add(int a, int b)
{
    int result = a + b;

    // 戻り値はreturnで返す
    // 型はメソッド名の左側型と揃える
    return result;
}

 呼び出し側はメソッド名の左側に代入(「[変数名] = 」新しく変数を宣言する場合は「[型] [変数名] =」)する形で戻り値を受け取ることができます。

 戻り値がvoidの場合と、戻り値がそれ以外の場合で書き方が異なる点に注意してください。

 補足:戻り値がある場合でも戻り値を受け取る必要が無い場合は、戻り値がvoidの場合と同様に代入なしで記述できます。

// 戻り値は代入記号(=)の左辺に変数を記述することで受け取れる
int result = Add(4, 6);

 戻り値のあるメソッドはメソッド名の左側に型を指定します。

 加えてreturnという記号を使って値を返すことができます。値を返さない処理パスがあるとエラーになるので注意してください。

// 戻り値のあるメソッドメソッド名(Add)の左側に戻り値の型を記述
public static int Add(int a, int b)
{
    int result = a + b;

    // 戻り値はreturnで返す
    // 型はメソッド名の左側型と揃える
    return result;
}

 メソッド内のresultと呼び出し側のint resultに何か関連があると考えるかもしれませんが、偶然同じ変数名になっただけです(誤解する方が多いのであえて同じ変数名にしました)。

 補足:先ほども書きましたがAddメソッド内で宣言した変数のスコープ(有効範囲)はメソッド内のみです。同じスコープ内で同じ変数名の変数を宣言することはできませんが、呼び出し側とはスコープがことなるため上のコードはエラーになりません。

 詳しくは「スコープ」の項目を参考にしてください。

書式まとめ

 メソッドは呼び出し側と宣言側の2つの書式を理解する必要があります。

 呼び出し側(戻り値が無い場合)

[メソッド名](実引数); *引数が無い場合は省略可能

 呼び出し側(戻り値がある場合)

[変数] = [メソッド名](実引数); *引数が無い場合は省略可能

 呼び出し側の引数は実際に渡す値ということで「実引数」と呼びます。

 メソッドの定義側は以下の書式になります。

 メソッド定義(戻り値が無い場合)

public static void [メソッド名]([型] [変数名]) *引数が無い場合は省略可能(複数指定する場合はカンマ(,)で区切って並べる)
{
    // 処理
}

 メソッド定義(戻り値がある場合)

public static [型] [メソッド名]([型] [変数名]) *引数が無い場合は省略可能(複数指定する場合はカンマ(,)で区切って並べる)
{
    // 処理
    return 値; *値は変数名またはリテラルで指定します。値の型はメソッド名の左側に記載した型に合わせる必要があります
}

 これでメソッドの基本的な解説は終了です。

 演習に進んで問題を解きながら理解を深めましょう。