Sök…


Syntax

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

parametrar

Parameter detaljer
arg eller arg1 metodens (första) parameter
arg2 metodens andra parameter
arg3 metodens tredje parameter
arg4 metodens fjärde parameter
T eller T1 typen av metodens (första) parameter
T2 typen av metodens andra parameter
T3 typen av metodens tredje parameter
T4 typen av metodens fjärde parameter
TResult metodens returtyp

Utan parametrar

Detta exempel visar hur man skapar en delegat som kapslar in den metod som returnerar aktuell tid

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

Med flera variabler

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 & anonyma metoder

En anonym metod kan tilldelas varhelst en delegat förväntas:

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

Lambda-uttryck kan användas för att uttrycka samma sak:

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

I båda fallen kan vi nu anropa metoden lagras i square så här:

var sq = square.Invoke(2);

Eller som en kortfattning:

var sq = square(2);

Observera att för att tilldelningen ska vara typsäker, måste parametertyperna och returtypen för den anonyma metoden matcha dem av delegattypen:

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

Parametrar av kovariant och contravariant

Func stöder också Covariant & Contravariant

// 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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow