メソッド (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;
}

Valueと. 渡しと参照渡し

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

参照型のオブジェクトがメソッドに渡されると、オブジェクトへの参照が渡されます。つまり、メソッドは、オブジェクトをオブジェクト自体の場所を示す引数を受け取りますが。この参照を使用してオブジェクトのメンバーを変更した場合、呼び出し元のメソッドの引数の値を変更はオブジェクトを渡しても、反映されます。

class のキーワードを使用して参照型を作成するには、次の例に示すように。

public class SampleRefType
{
    public int value;
}

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

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;
}

例は前の例と値をメソッドに引数を渡す基本的に同じことを実行します。しかし、参照型を使用しているため、結果は異なります。パラメーターの value のフィールドの ModifyObject で行われた変更、objは、引数、TestRefType のメソッドの rtの value のフィールドを変更します。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# リファレンス)」を参照してください。

単一のメソッド

非同期機能を使用して、明示的なコールバックを使用しないで非同期メソッドを呼び出すか、手動で複数のメソッドまたはラムダ式の間でのコードを切り離して。async機能が導入された Visual Studio 2012いません。

async 修飾子のメソッドにマークを付ける場合、メソッドで [await] の演算子を使用できます。コントロールが非同期のメソッドの要求の式に到達すると、コントロールは呼び出し元に戻り、予期されるタスクが完了するまでメソッドの進行状況は中断されます。タスクが完了すると、実行には、メソッドで再開できます。

[!メモ]

非同期のメソッドは、呼び出し元にどちらかが最初に発生する、どのでも、完全ではない場合や、非同期のメソッドの終わりに達する最初に、予期したオブジェクトを検出した場合に返されます。

非同期のメソッドは Task<TResult>Task、または無効の戻り値の型を持つことができます。無効の戻り値の型と戻り値の型を必要な無効にするイベント ハンドラーを定義するために主に使用されます。voidを返す非同期のメソッドは、voidを返すメソッドの呼び出し元メソッドがスローする例外をキャッチできません待ちます。

次の例では、DelayAsync は Task<TResult>の戻り値の型が非同期のメソッドです。DelayAsync に整数を返す return のステートメントがあります。したがって DelayAsync のメソッド宣言は Task<int>の戻り値の型が必要です。戻り値の型が Task<int>であるため、DoSomethingAsync の await の式の評価は次のステートメントに示すように整数を生成します: int result = await delayTask。

startButton_Click のメソッドは、voidの戻り値の型が非同期のメソッドの例です。DoSomethingAsync が非同期のメソッドであるため、DoSomethingAsync の呼び出しのタスクは次のステートメントに示すよう待たれなければがあります: await DoSomethingAsync();。startButton_Click のメソッドは async 修飾子とメソッドに await 式を含むして定義する必要があります。

// using System.Diagnostics;
// using System.Threading.Tasks;

// This Click event is marked with the async modifier.
private async void startButton_Click(object sender, RoutedEventArgs e)
{
    await DoSomethingAsync();
}

private async Task DoSomethingAsync()
{
    Task<int> delayTask = DelayAsync();
    int result = await delayTask;

    // The previous two statements may be combined into
    // the following statement.
    //int result = await DelayAsync();

    Debug.WriteLine("Result: " + result);
}

private async Task<int> DelayAsync()
{
    await Task.Delay(100);
    return 5;
}

// Output:
//  Result: 5

非同期のメソッドは ref またはのパラメーターを宣言できませんが、このようなパラメーターを持つメソッドを呼び出します。

asyncの方法の詳細については、Async および Await を使用した非同期プログラミング (C# および Visual Basic)非同期プログラムにおける制御フロー (C# および Visual Basic)非同期の戻り値の型 (C# および Visual Basic)を参照してください。

反復子

反復子は、リストや配列などのコレクションに対するカスタムのイテレーションを実行します。反復子は、要素を一つずつ返すために yieldを返します。 のステートメントを使用します。yieldを返します。 のステートメントに到達すると、コードの現在の位置が保持されます。実装は、その場所から反復子は、次に呼び出されると再起動されます。

foreach のステートメントを使用して、クライアント コードからの反復子を呼び出します。

反復子の戻り値の型は IEnumerableIEnumerable<T>IEnumerator、または IEnumerator<T>のいずれかになります。

詳細については、「反復子 (C# および Visual Basic)」を参照してください。

C# 言語仕様

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

参照

関連項目

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

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

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

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

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

params (C# リファレンス)

return (C# リファレンス)

out (C# リファレンス)

ref (C# リファレンス)

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

概念

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