Zoeken…


Syntaxis

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

parameters

Parameter Details
arg of arg1 de (eerste) parameter van de methode
arg2 de tweede parameter van de methode
arg3 de derde parameter van de methode
arg4 de vierde parameter van de methode
T of T1 het type van de (eerste) parameter van de methode
T2 het type van de tweede parameter van de methode
T3 het type van de derde parameter van de methode
T4 het type van de vierde parameter van de methode
TResult het retourtype van de methode

Zonder parameters

In dit voorbeeld wordt getoond hoe u een gemachtigde maakt die de methode inkapselt die de huidige tijd retourneert

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

Met meerdere variabelen

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 & anonieme methoden

Een anonieme methode kan worden toegewezen waar een afgevaardigde wordt verwacht:

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

Lambda-expressies kunnen worden gebruikt om hetzelfde uit te drukken:

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

In beide gevallen kunnen we nu de methode gebruiken die als square in het square opgeslagen:

var sq = square.Invoke(2);

Of als afkorting:

var sq = square(2);

Merk op dat, om de toewijzing typeveilig te maken, de parametertypen en het retourtype van de anonieme methode moeten overeenkomen met die van het gedelegeerde type:

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

Covariant & Contravariant Type Parameters

Func ondersteunt ook 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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow