メソッド (C# プログラミング ガイド)
メソッドは、一連のステートメントを含むコード ブロックです。C# では、実行されるすべての命令がメソッドのコンテキストで実行されます。
メソッドは、クラスまたは構造体の中で、アクセス レベル、戻り値、メソッドの名前、およびメソッド パラメータを指定して宣言します。メソッド パラメータはかっこで囲み、コンマで区切って指定します。メソッドでパラメータが不要な場合は、かっこ内を空にします。次に 3 つのメソッドを含むクラスの例を示します。
class Motorcycle
{
public void StartEngine() { }
public void AddGas(int gallons) { }
public int Drive(int miles, int speed) { return 0; }
}
オブジェクトでメソッドを呼び出すのは、フィールドにアクセスするのと似ています。オブジェクト名の後に、ピリオド、メソッド名、およびかっこを追加します。引数はかっこの中に記述し、コンマで区切ります。そのため、たとえば、Motorcycle
クラスのメソッドは、次のように呼び出すことができます。
Motorcycle moto = new Motorcycle();
moto.StartEngine();
moto.AddGas(15);
moto.Drive(5, 20);
メソッド パラメータ
上のコード スニペットに示されているように、メソッドに引数を渡す場合は、メソッドを呼び出すときにかっこの中に引数を入力するだけで済みます。呼び出されるメソッドの側から見た場合、入ってくる引数をパラメータと言います。
メソッドが受け取るパラメータもかっこ内に指定しますが、パラメータごとに型と名前を指定する必要があります。この名前は、引数と同じにする必要はありません。次に例を示します。
public static void PassesInteger()
{
int fortyFour = 44;
TakesInteger(fortyFour);
}
static void TakesInteger(int i)
{
i = 33;
}
この例では、PassesInteger
というメソッドが TakesInteger
というメソッドに引数を渡します。PassesInteger
では、引数は fortyFour
という名前ですが、TakeInteger
では、この引数は i
という名前のパラメータです。このパラメータは、TakesInteger
メソッドの中だけに存在します。このメソッドの内部で宣言されたパラメータまたは変数でない限り、他の任意の数の変数に i
という名前を付け、任意の型を指定できます。
TakesInteger
は、指定された引数に新しい値を代入します。この変更は、TakeInteger
から制御が戻ると PassesInteger
メソッドに反映するように思われますが、実際には、fortyFour
変数の値は変更されません。これは、int が値型であるためです。既定では、値型がメソッドに渡されるときは、オブジェクト自体ではなく、そのコピーが渡されます。そのため、パラメータに対して行われた変更は、呼び出し元のメソッドに影響しません。値型という名前は、オブジェクト自体ではなく、オブジェクトのコピーが渡されるという事実に基づくものです。値は渡されますが、同じオブジェクトではありません。
値型の引き渡しの詳細については、「値型のパラメータの引き渡し (C# プログラミング ガイド)」を参照してください。C# に不可欠な値型の一覧については、「値型の一覧表 (C# リファレンス)」を参照してください。
値型は、参照渡しされる参照型と異なります。参照型に基づくオブジェクトがメソッドに渡される場合、オブジェクトのコピーは作成されません。代わりに、メソッドの引数として使用されるオブジェクトへの参照が作成され、渡されます。そのため、この参照を通じて行われた変更は、呼び出し元のメソッドに反映されます。参照型を作成するときは、class キーワードを使用します。この例を次に示します。
public class SampleRefType
{
public int value;
}
この型に基づくオブジェクトがメソッドに渡される場合は、参照渡しされます。次に例を示します。
public static void TestRefType()
{
SampleRefType rt = new SampleRefType();
rt.value = 44;
ModifyObject(rt);
System.Console.WriteLine(rt.value);
}
static void ModifyObject(SampleRefType obj)
{
obj.value = 33;
}
この例は、基本的に前の例と同じです。しかし、参照型を使用しているため、ModifyObject
によって行われた変更は、TestRefType
メソッドで作成されたオブジェクトに反映されます。そのため、TestRefType
メソッドは、値として 33 を表示します。
詳細については、「参照型のパラメータの引き渡し (C# プログラミング ガイド)」および「参照型 (C# リファレンス)」を参照してください。
戻り値
メソッドは、呼び出し元に値を返すことができます。戻り値の型 (メソッド名の前に記述されている型) が void でない場合、メソッドは、return キーワードを使用して値を返すことができます。return キーワードと、その後に戻り値の型に一致する値が記述されたステートメントは、その値をメソッドの呼び出し元に返します。また、return キーワードは、メソッドの実行を中止します。戻り値の型が void の場合でも、値を持たない return ステートメントは、メソッドの実行を中止するのに役立ちます。return キーワードを使用しないと、メソッドは、コード ブロックの最後に到達したときに実行を中止します。戻り値の型が void 以外のメソッドで値を返すには、return キーワードを使用する必要があります。たとえば、次の 2 つのメソッドは、return キーワードを使用して整数を返します。
class SimpleMath
{
public int AddTwoNumbers(int number1, int number2)
{
return number1 + number2;
}
public int SquareANumber(int number)
{
return number * number;
}
}
メソッドから返された値を使用するために、呼び出し元のメソッドは、同じ型の値であれば、メソッド呼び出し自体を使用できます。戻り値は、変数に代入することもできます。たとえば、次の 2 つのコード例では、同様の結果が得られます。
int result = obj.AddTwoNumbers(1, 2);
obj.SquareANumber(result);
obj.SquareANumber(obj.AddTwoNumbers(1, 2));
中間変数 (上の例では、result
) を使用して値を格納する処理は、省略可能です。中間変数を使用すると、コードが読みやすくなり、また値を繰り返し使用する場合は、必要になることもあります。
詳細については、「return (C# リファレンス)」を参照してください。
C# 言語仕様
詳細については、「C# 言語仕様」の次のセクションを参照してください。
1.6.5 メソッド
10.5 メソッド
参照
関連項目
オブジェクト、クラス、および構造体 (C# プログラミング ガイド)
アクセス修飾子 (C# プログラミング ガイド)
静的クラスと静的クラス メンバ (C# プログラミング ガイド)
継承 (C# プログラミング ガイド)
params (C# リファレンス)
return (C# リファレンス)
out (C# リファレンス)
ref (C# リファレンス)
パラメータの引き渡し (C# プログラミング ガイド)