Sdílet prostřednictvím


Metody (Příručka programování C#)

Metoda je blok kódu, který obsahuje sled příkazů.Program způsobuje příkazy provedeny voláním metody a určení argumentů požadované metody.V jazyce C# každé provedené instrukce se provádí v rámci metody.Metoda Main je vstupní bod pro každou aplikaci C# a se nazývá podle common language runtime (CLR) při spuštění programu.

[!POZNÁMKA]

Toto téma popisuje pojmenované metody.Informace o anonymní funkce, Anonymní funkce (Příručka programování C#).

Podpisy metody

Metody jsou deklarovány v třídy nebo struktury zadáním úroveň přístupu public nebo private, volitelných parametrů, jako abstract nebo sealed, vrácená hodnota, název metody a parametry metody.Tyto části jsou společně podpis metody.

[!POZNÁMKA]

Návratový typ metody není součástí podpis metody pro účely přetížení metody.Je však součástí podpis metody při určování kompatibility mezi delegáta a odkazující na metodu.

Parametry metody jsou uvedeny v závorkách a odděleny čárkami.Prázdné závorky označují, že vyžaduje metodu bez parametrů.Tato třída obsahuje tři metody:

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

Metoda přístupu

Volání metody objektu je podobný přístup k poli.Za název objektu přidejte tečku, název metody a závorky.Argumenty jsou uvedeny v závorce a jsou odděleny čárkami.Metody Motorcycle třídy lze volat proto jako v následujícím příkladu:

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

Parametry metody VS. argumenty

Definice metody určuje názvy a typy parametrů, které jsou požadovány.Při volání metody kód volá, poskytuje konkrétních hodnot, nazývaných argumenty pro každý parametr.Argumenty musí být kompatibilní s typem parametru, ale argument název (pokud existuje) v volající kód nemusí být stejný jako parametr s názvem definována v metodě.Příklad:

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

Předání odkazem VS. předání hodnotou

Ve výchozím při typu hodnoty je předán metodě, předána kopie místo samotného objektu.Změny v argumentu tudíž žádný vliv na původní kopie ve volání metody.Typ hodnoty lze předat podle odkazu pomocí klíčového slova ref.Další informace naleznete v tématu Předávání parametrů typu hodnoty (Příručka programování C#).Seznam typů předdefinovaných hodnot naleznete v tématu Hodnota tabulky typy (C#-Reference).

Pokud je předán objekt typu referenční metodu, je předán odkaz na objekt.Metoda přijímá, nikoli samotný objekt, ale argument, který určuje umístění objektu.Pokud změníte člen objektu pomocí tohoto odkazu, projeví se argument ve volání metody i v případě předání objektu podle hodnoty.

Vytvořit typ odkazu pomocí class klíčové slovo, jak ukazuje následující příklad.

public class SampleRefType
{
    public int value;
}

Pokud předáte objekt, který je založen na tento typ metody, je nyní předán odkaz na objekt.Následující příklad předá objekt typu SampleRefType metody ModifyObject.

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

V příkladu nemá v podstatě totéž jako předchozí příklad, předává argument hodnota metody.Ale protože je použit typ odkazu, výsledek se liší.Změna je provedena v ModifyObject na value pole parametru, obj, také změní value pole argumentu, rt, v TestRefType metoda.TestRefType Metoda zobrazí jako výstup 33.

Další informace o tom, jak předat referenční typy odkaz a hodnota naleznete Předávání parametrů typu Reference (Příručka programování C#) a Typy odkazů (C#-Reference).

Vrácené hodnoty

Metody může vrátit hodnotu volajícímu.Pokud typ návratu, zadejte před název metody uvedené není void, metoda může vrátit hodnotu pomocí return klíčové slovo.Prohlášení se return klíčové slovo následované hodnotu, která odpovídá návratový typ vrátí hodnotu volající metodu.return Klíčové slovo také zastaví provádění metody.Pokud návratový typ je void, return příkaz bez hodnoty je stále užitečné zastavit provádění metody.Aniž by return klíčové slovo, metoda bude zastavit provádění dosáhne konec bloku kódu.Metody s než void vrátí typ jsou povinny používat return klíčové slovo vrátit hodnotu.Například použití těchto dvou metod return klíčové vrací celá čísla:

class SimpleMath
{
    public int AddTwoNumbers(int number1, int number2)
    {
        return number1 + number2;
    }

    public int SquareANumber(int number)
    {
        return number * number;
    }
}

Použít hodnotu, vrátí metoda, volající metodu pomocí volání metody samotné kdekoli hodnotu stejného typu by dostatečné.Můžete také přiřadit vrácená hodnota proměnné.Například následující dva příklady dosáhnout stejného cíle:

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

Pomocí místní proměnné v tomto případě result, k uložení hodnoty je nepovinné.To může pomoci čitelnost kódu nebo může být nezbytné, pokud potřebujete uložit původní hodnota argumentu pro celý obor metoda.

Další informace naleznete v tématu vrátit (C#-Reference).

Asynchronní metody

Pomocí funkce asynchronní může vyvolat asynchronní metody bez použití explicitní volání nebo Ruční rozdělení kódu více metod nebo lambda výrazy.Asynchronní funkce byla zavedena Visual Studio 2012.

Pokud označíte metodu s asynchronní modifikátor, můžete použít vyčkání operátor v metodě.Výraz await asynchronní metody dosáhne ovládací prvek vrací řízení volajícímu a pokroku v metodě je pozastavena až do dokončení úkolu awaited.Po dokončení úkolu může pokračovat spuštění metody.

[!POZNÁMKA]

Asynchronní metody vrátí volajícímu, když narazí na první objekt awaited, který ještě není dokončena nebo získá konec asynchronní metody nastane dříve.

Asynchronní metody mohou mít návratový typ Task<TResult>, Task, nebo je neplatný.Typ vrácené hodnoty void slouží především k definování obslužné rutiny událostí, kde je vyžadován typ vrácené hodnoty void.Asynchronní metody, která vrací hodnotu typu void nelze imunofluorescenčním a volající metodu vracející void nelze zachytit výjimky, které vyvolá metoda.

V následujícím příkladu DelayAsync je asynchronní metody, která má návratový typ Task<TResult>.DelayAsyncmá return příkaz, který vrací celé číslo.Proto metoda prohlášení o DelayAsync musí mít návratový typ Task<int>.Protože návratový typ je Task<int>, hodnocení await výraz v DoSomethingAsync vytváří celé, jak ukazuje následující příkaz: int result = await delayTask.

startButton_Click Metoda je příklad asynchronní metody, která má návratový typ void.Protože DoSomethingAsync je asynchronní metody úkol pro volání DoSomethingAsync musí imunofluorescenčním, jak ukazuje následující příkaz: await DoSomethingAsync();.startButton_Click Metoda musí být definován async modifikátor protože metoda await výraz.

// 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

Asynchronní metody nelze deklarovat všechny ref nebo podle parametry, ale můžete volat metody, které mají tyto parametry.

Další informace o asynchronní metody viz Asynchronní asynchronní pro programování a očekávat (C# a Visual Basic), Řízení toku v programech asynchronní (C# a Visual Basic), a Typy vrácení asynchronní (C# a Visual Basic).

Iterátory

Iterace provádí vlastní iteraci přes kolekci, seznam nebo pole.Iterace používá příkazu yield return příkaz vrátit každý prvek v čase.Při příkazu yield return prohlášení je dosaženo, je zapamatované aktuální umístění v kódu.Spuštění při příštím volání iterace restartován z tohoto umístění.

Iterace volat z klientského kódu pomocí foreach prohlášení.

The return type of an iterator can be IEnumerable, IEnumerable<T>, IEnumerator, or IEnumerator<T>.

Další informace naleznete v tématu U iterátorů (C# a Visual Basic).

Specifikace jazyka C#

Další informace naleznete v tématu Specifikace jazyka C#. Specifikace jazyka je úplným a rozhodujícím zdrojem pro syntaxi a použití jazyka C#.

Viz také

Referenční dokumentace

Třídy a struktur (Příručka programování C#)

Modifikátory přístupu (Příručka programování C#)

Statické třídy a členy statických tříd (Příručka programování C#)

Dědičnost (Příručka programování C#)

Abstraktní a uzavřených tříd a členů tříd (Příručka programování C#)

Parametry (C#-Reference)

vrátit (C#-Reference)

mimo (C#-Reference)

REF (C#-Reference)

Předávání parametrů (Příručka programování C#)

Koncepty

Příručka programování C#