メソッド (C# プログラミング ガイド)

メソッドは、一連のステートメントを含むコード ブロックです。 必要なメソッド引数を指定してプログラムからメソッドを呼び出すと、メソッド内のステートメントが実行されます。 C# では、実行されるすべての命令がメソッドのコンテキストで実行されます。 Main メソッドは、すべての C# アプリケーションのエントリ ポイントです。プログラムの起動時には、このメソッドが共通言語ランタイム (CLR: Common Language Runtime) によって呼び出されます。

注意

このトピックでは、名前付きメソッドについて説明します。 匿名関数の詳細については、「匿名関数 (C# プログラミング ガイド)」を参照してください。

メソッド シグネチャ

メソッドは、クラスまたは構造体で、アクセス レベル (public や private など)、オプションの修飾子 (abstract や sealed など)、戻り値、メソッドの名前、およびメソッド パラメーターを指定して宣言します。 これらが一緒になって、メソッドのシグネチャとなります。

注意

メソッドの戻り値の型は、メソッドのオーバーロードを目的とした、メソッドのシグネチャには含まれません。 ただし、デリゲートとそれが指すメソッドの間の互換性を判別する場合には、メソッドのシグネチャの一部となります。

メソッド パラメーターはかっこで囲み、コンマで区切って指定します。 メソッドでパラメーターが不要な場合は、かっこ内を空にします。 次に 3 つのメソッドを含むクラスの例を示します。

abstract class Motorcycle
{
    // Anyone can call this.
    public void StartEngine() {/* Method statements here */ }

    // Only derived classes can call this.
    protected void AddGas(int gallons) { /* Method statements here */ }

    // Derived classes can override the base class implementation.
    public virtual int Drive(int miles, int speed) { /* Method statements here */ return 1; }

    // Derived classes must implement this.
    public abstract double GetTopSpeed(); 
}

メソッドへのアクセス

オブジェクトでメソッドを呼び出すのは、フィールドにアクセスするのと似ています。 オブジェクト名の後に、ピリオド、メソッド名、およびかっこを追加します。 引数はかっこの中に記述し、コンマで区切ります。 Motorcycle クラスのメソッドの呼び出し例を以下に示します。

class TestMotorcycle : Motorcycle
{

    public override double GetTopSpeed()
    {
        return 108.4;
    }

    static void Main()
    {

        TestMotorcycle moto = new TestMotorcycle();

        moto.StartEngine();
        moto.AddGas(15);
        moto.Drive(5, 20);
        double speed = moto.GetTopSpeed();
        Console.WriteLine("My top speed is {0}", speed);            
    }
}

メソッドのパラメーターと引数

メソッド定義には、必要なパラメーターの名前と型を指定します。 呼び出し元のコードからメソッドを呼び出すときは、各パラメーターに引数と呼ばれる具体的な値を指定します。 引数にはパラメーター型との互換性が必要ですが、呼び出し元のコードで使用される引数名 (使用される場合) は、メソッドで定義されるのと同じパラメーター名でなくてかまいません。 次に例を示します。

public void Caller()
{
    int numA = 4;
    // Call with an int variable.
    int productA = Square(numA);

    int numB = 32;
    // Call with another int variable.
    int productB = Square(numB);

    // Call with an integer literal.
    int productC = Square(12);

    // Call with an expression that evaulates to int.
    productC = Square(productA * 3);
}

int Square(int i)
{
    // Store input argument in a local variable.
    int input = i;
    return input * input;
}

参照渡しと値渡し

既定では、値型がメソッドに渡されるときは、オブジェクト自体ではなく、そのコピーが渡されます。 したがって、引数に対して行われた変更は、呼び出し元のメソッドにある元のコピーには影響しません。 ref キーワードを使用すると、参照によって値型を引き渡すことができます。 詳細については、「値型のパラメーターの引き渡し (C# プログラミング ガイド)」を参照してください。 組み込みの値型の一覧については、「値型の一覧表 (C# リファレンス)」を参照してください。

参照型は参照によって引き渡されます。 参照型のオブジェクトがメソッドに渡される場合、その参照は、コピーではなく元のオブジェクトを指します。 そのため、この参照を通じて行われた変更は、呼び出し元のメソッドに反映されます。 参照型は class キーワードを使用して作成されます。次に例を示します。

public class SampleRefType
{
    public int value;
}

この型に基づくオブジェクトがメソッドに渡される場合は、参照渡しされます。 次に例を示します。

public static void TestRefType()
{
    SampleRefType rt = new SampleRefType();
    rt.value = 44;
    ModifyObject(rt);
    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);
result = obj.SquareANumber(result);
// The result is 9.
Console.WriteLine(result);
result = obj.SquareANumber(obj.AddTwoNumbers(1, 2));
// The result is 9.
Console.WriteLine(result);

ローカル変数 (上の例では result) を使用して値を格納する処理は省略可能です。 ただし、このローカル変数によってコードの読みやすさが向上することもあります。また、引数の元の値をメソッドのスコープ全体で保持する場合に必要になることもあります。

詳細については、「return (C# リファレンス)」を参照してください。

C# 言語仕様

詳細については、「C# 言語仕様」を参照してください。 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。

参照

参照

クラスと構造体 (C# プログラミング ガイド)

アクセス修飾子 (C# プログラミング ガイド)

静的クラスと静的クラス メンバー (C# プログラミング ガイド)

継承 (C# プログラミング ガイド)

抽象クラスとシール クラス、およびクラス メンバー (C# プログラミング ガイド)

params (C# リファレンス)

return (C# リファレンス)

out (C# リファレンス)

ref (C# リファレンス)

パラメーターの引き渡し (C# プログラミング ガイド)

概念

C# プログラミング ガイド