Szukaj…


Składnia

  • public delegate TResult Func<in T, out TResult>(T arg)
  • public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2)
  • public delegate TResult Func<in T1, in T2, in T3, out TResult>(T1 arg1, T2 arg2, T3 arg3)
  • public delegate TResult Func<in T1, in T2, in T3, in T4, out TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4)

Parametry

Parametr Detale
arg lub arg1 (pierwszy) parametr metody
arg2 drugi parametr metody
arg3 trzeci parametr metody
arg4 czwarty parametr metody
T lub T1 typ (pierwszego) parametru metody
T2 rodzaj drugiego parametru metody
T3 typ trzeciego parametru metody
T4 typ czwartego parametru metody
TResult typ zwracanej metody

Bez parametrów

Ten przykład pokazuje, jak utworzyć delegata, który zawiera metodę zwracającą bieżący czas

static DateTime UTCNow()
{
    return DateTime.UtcNow;
}

static DateTime LocalNow()
{
    return DateTime.Now;
}

static void Main(string[] args)
{
    Func<DateTime> method = UTCNow;
    // method points to the UTCNow method
    // that retuns current UTC time  
    DateTime utcNow = method();

    method = LocalNow;
    // now method points to the LocalNow method
    // that returns local time

    DateTime localNow = method();
}

Z wieloma zmiennymi

static int Sum(int a, int b)
{
    return a + b;
}

static int Multiplication(int a, int b)
{
    return a * b;
}

static void Main(string[] args)
{
    Func<int, int, int> method = Sum;
    // method points to the Sum method
    // that retuns 1 int variable and takes 2 int variables  
    int sum = method(1, 1);

    method = Multiplication;
    // now method points to the Multiplication method

    int multiplication = method(1, 1);
}

Lambda i metody anonimowe

Anonimową metodę można przypisać wszędzie tam, gdzie oczekuje się delegata:

Func<int, int> square = delegate (int x) { return x * x; }

Wyrażeń lambda można użyć do wyrażenia tego samego:

Func<int, int> square = x => x * x;

W obu przypadkach możemy teraz wywołać metodę zapisaną w square :

var sq = square.Invoke(2);

Lub jako skrót:

var sq = square(2);

Zauważ, że aby przypisanie było bezpieczne dla typu, typy parametrów i typ zwracany przez metodę anonimową muszą być zgodne z typem delegowanego:

Func<int, int> sum = delegate (int x, int y) { return x + y; } // error
Func<int, int> sum = (x, y) => x + y; // error

Parametry typu kowariantnego i przeciwstawnego

Func obsługuje również kowariant i kontrawariant

// Simple hierarchy of classes.
public class Person { }
public class Employee : Person { }

class Program
{
    static Employee FindByTitle(String title)
    {
        // This is a stub for a method that returns
        // an employee that has the specified title.
        return new Employee();
    }

    static void Test()
    {
        // Create an instance of the delegate without using variance.
        Func<String, Employee> findEmployee = FindByTitle;

        // The delegate expects a method to return Person,
        // but you can assign it a method that returns Employee.
        Func<String, Person> findPerson = FindByTitle;

        // You can also assign a delegate 
        // that returns a more derived type 
        // to a delegate that returns a less derived type.
        findPerson = findEmployee;

    }
}


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow