メソッド(Method)

メソッドとは名前の付いたコードブロックのことです。プログラム内の別の箇所からメソッド名を呼び出すことで処理を実行でき、データを渡したり、メソッドから戻り値を受け取ったりすることが可能です。

メソッドの構成要素

先に説明した通り、メソッドはクラスに属する関数メンバーです。

メソッドは本質的に関数です。関数がクラス内部に定義されている場合、専門用語として「メソッド」と呼びます。C言語ではこれらをすべて関数と呼びます。

メソッドは大きく二つの要素から構成されます:メソッドヘッダ(宣言部)メソッド本体です。

  1. メソッドヘッダ:メソッドの性質をすべて定義し、次の情報を記述します:
    • 戻り値の有無。戻り値が存在する場合は戻り値の型を指定する
    • メソッド名
    • 受け渡し可能なデータの型、およびデータの処理ルール
  2. メソッド本体:実行可能な一連の命令文で構成されます。プログラムは本体の最初の文から順番に1行ずつ実行します。

実例を見てみましょう

    string Introduce(string name,int age)
    {
        string words = $"hello my name is {name},i'm {age} years old";
        Console.WriteLine(words);
        return words;
    }Code language: C# (cs)

メソッドヘッダ: string Introduce(string name,int age)

  • string :戻り値の型、文字列型
  • Introduce:メソッド名
  • (string name,int age):引数リスト。これらは変数として外部から渡される名前と年齢を受け取り、メソッド本体内で利用できます。
上図はメソッドの各部位の解説となります

このメソッドを呼び出すにはどうすればよいでしょうか?

このメソッドはProgramクラス内に定義され、Mainメソッドと同じクラスに存在します。ただMainはstatic(静的)メソッドであり、静的メソッドから非静的メソッドを直接呼び出すことはできません。Introduceを呼び出したい場合、まずProgramのインスタンスを作成し、インスタンス経由で呼び出す必要があります。

class Program
{
    static void Main()
    {
        Program program = new Program();
        program.Introduce("John", 30);
    }

    string Introduce(string name,int age)
    {
        string words = $"hello my name is {name},i'm {age} years old";
        Console.WriteLine(words);
        return words;
    }
}Code language: C# (cs)

下記のように直接呼び出すとエラーが発生します

正しい記述方法はMain関数内でnewを使ってProgramのインスタンスを生成し、インスタンスからIntroduceを呼び出すことです

Program program = new Program();//√
program.Introduce("John", 30);Code language: C# (cs)

メソッド本体

メソッド本体には0個または複数の実行文を記述できます。

メソッド本体はコードブロック(波括弧で囲まれた一連の命令)であり、ブロック内には次の要素を記述可能です:

  • ローカル変数
  • 制御構文(ループ、条件分岐など)
  • 他のメソッドを呼び出す処理
  • 入れ子になったサブコードブロック
  • ローカル関数(メソッド内部に定義するサブメソッド)[後ほど学習します]
class Program
{
    static void Main()
    {
        int age = 3; // ローカル変数、初期値3
        while (age > 0) // 制御構文
        {
            --age;
            Introduce("Tom", age); // メソッド呼び出し
        }

        {
            //入れ子のサブコードブロック
        }
    }

    static string Introduce(string name,int age)
    {
        string words = $"hello my name is {name},i'm {age} years old";
        Console.WriteLine(words);
        return words;
    }
}
Code language: JavaScript (javascript)

上記コードではIntroduce関数にstaticを付加し静的関数に変更しています。これによりMain関数からインスタンスを作成せず直接呼び出せるようになります。


ローカル変数(Local Variables)

先に説明したインスタンスフィールドと同じく、ローカル変数はデータを保持するために使用されます。インスタンスフィールドは主にオブジェクトの状態を保存するのに対し、ローカル変数は一時的な計算処理のデータを格納する用途で使われます。

ローカル変数を持つメソッドの実行が終わると、変数はスタックから解放されます。値型の場合は即時破棄され、参照型の場合は後のタイミングでガベージコレクタによって回収されます。

1. ローカル変数の宣言構文
型 変数名 = 初期値;
  • 変数名:自作の識別子
  • = 初期値:省略可能な初期化処理、変数に初期値を代入する

2. ローカル変数の重要ルール

  1. ライフタイムとスコープ:宣言されたコードブロック、および内部のすべての入れ子ブロック内でのみ有効
    • 変数は宣言した行で作成され有効になる
    • コードブロックの実行が完了すると変数は無効化・破棄される
  2. 宣言位置に制限なし:メソッド本体内の任意の場所に記述可能、ただし使用する前に宣言する必要がある
    static void Main()
    {
        int age = 3; //ローカル変数
        Phone p = new Phone(); //独自型のローカル変数

        {
            int one = 1; //サブコードブロック内のローカル変数
            bool two = false;
        }

        double d = 0;
    }Code language: JavaScript (javascript)
上図のサブコードブロック実行後、oneとtwoのローカル変数はスタックから除去され破棄されます

インスタンスフィールド vs ローカル変数

インスタンスフィールドローカル変数
ライフタイムオブジェクトインスタンス生成時に作成;
オブジェクトにアクセスできなくなると破棄
宣言行で有効化;
属するコードブロック実行終了時に破棄
既定初期化コンパイラが自動で型に応じた既定値を代入自動初期化なし;
値を代入せず使用するとコンパイルエラー
メモリ配置値型・参照型問わずすべてヒープ(Heap)上に配置値型:スタック(Stack);
参照型:参照情報はスタック、オブジェクト本体はヒープ

メソッド(Method)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です