Udostępnij za pośrednictwem


Anonimowe metody (Podręcznik programowania C#)

W wersjach języka C# przed 2.0, tylko sposób deklarowania delegować było użyć o nazwie metody.C# 2.0 wprowadzone metody anonimowe i w C# 3.0 i nowsze, wyrażenia lambda zastępują anonimowe metody jako preferowanym sposobem napisania kodu wbudowanego.Jednakże informacje anonimowe metody w tym temacie dotyczą również wyrażenia lambda.Istnieje jeden przypadek, w którym metody anonimowej zapewnia funkcjonalność nie znaleziono w wyrażeniach lambda.Anonimowe metody umożliwiają pominąć listy parametrów.Oznacza to, że metody anonimowej można przekonwertować na delegatów z różnych podpisów.Nie jest to możliwe z wyrażenia lambda.Aby uzyskać więcej informacji na temat wyrażeń lambda, zobacz Wyrażenia lambda (Podręcznik programowania C#).

Tworzenie metody anonimowe jest zasadniczo sposobem przekazywania blok kodu jako parametr obiektu delegowanego.Oto dwa przykłady:

// Create a handler for a click event.
button1.Click += delegate(System.Object o, System.EventArgs e)
                   { System.Windows.Forms.MessageBox.Show("Click!"); };
// Create a delegate.
delegate void Del(int x);

// Instantiate the delegate using an anonymous method.
Del d = delegate(int k) { /* ... */ };

Przy użyciu metody anonimowe, zmniejszyć, narzuty kodowania w uruchamianiu tego pełnomocnicy, ponieważ nie trzeba tworzyć oddzielne metody.

Na przykład określanie bloku kodu, zamiast pełnomocnik może być przydatne w sytuacji, gdy konieczności tworzenia metoda może wydawać się niepotrzebne obciążenie.Dobrym przykładem byłby po rozpoczęciu nowego wątku.Ta klasa tworzy wątek i również zawiera kod, który wątek wykonuje się bez tworzenia dodatkowych metody do pełnomocnika.

void StartThread()
{
    System.Threading.Thread t1 = new System.Threading.Thread
      (delegate()
            {
                System.Console.Write("Hello, ");
                System.Console.WriteLine("World!");
            });
    t1.Start();
}

Uwagi

Zakres parametrów metody anonimowej jest anonimowych bloku metody.

Występuje błąd ma instrukcja jump, takich jak goto, podziału, lub nadal, wewnątrz bloku metody anonimowej, jeśli obiekt docelowy jest poza blokiem.Jest również błąd ma instrukcja jump, takich jak goto, break, lub continue, poza bloku metody anonimowej, jeśli cel znajduje się wewnątrz bloku.

Zmienne lokalne i parametry, których zakres zawiera deklarację metody anonimowej są nazywane zewnętrzne zmiennych metody anonimowej.Na przykład w przypadku następującego segmentu kodu n jest zmienna zewnętrzne:

int n = 0;
Del d = delegate() { System.Console.WriteLine("Copy #:{0}", ++n); };

Odwołanie do zewnętrznej zmiennej n jest przechwycone podczas tworzenia obiektu delegowanego.W odróżnieniu od zmiennych lokalnych okres istnienia przechwyconych zmiennej rozszerza aż delegatów, które anonimowe metody referencyjne są czyszczeniu.

Nie można uzyskać dostępu anonimowego metody ref lub out parametry zewnętrznym zakresie.

Żaden niebezpieczny kod jest możliwy w anonimowych bloku metody.

Anonimowe metody nie są dozwolone po lewej stronie jest operatora.

Przykład

Poniższy przykład ilustruje uruchamianiu tego pełnomocnika na dwa sposoby:

  • Kojarzenie delegata z metody anonimowej.

  • Kojarzenie delegata z nazwanego metody (DoWork).

W każdym przypadku gdy pełnomocnik jest wywoływany jest wyświetlony komunikat.

// Declare a delegate.
delegate void Printer(string s);

class TestClass
{
    static void Main()
    {
        // Instatiate the delegate type using an anonymous method.
        Printer p = delegate(string j)
        {
            System.Console.WriteLine(j);
        };

        // Results from the anonymous delegate call.
        p("The delegate using the anonymous method is called.");

        // The delegate instantiation using a named method "DoWork".
        p = new Printer(TestClass.DoWork);

        // Results from the old style delegate call.
        p("The delegate using the named method is called.");
    }

    // The method associated with the named delegate.
    static void DoWork(string k)
    {
        System.Console.WriteLine(k);
    }
}
/* Output:
    The delegate using the anonymous method is called.
    The delegate using the named method is called.
*/

Zobacz też

Informacje

Pełnomocnicy (Podręcznik programowania C#)

Wyrażenia lambda (Podręcznik programowania C#)

Niebezpieczny kod i wskaźniki (Podręcznik programowania C#)

Metody (Podręcznik programowania C#)

Delegaci z vs nazwane. Anonimowe metody (Podręcznik programowania C#)

Koncepcje

Podręcznik programowania C#

Inne zasoby

C# odniesienia