C# - delegate System.Func< >

时间:2009-08-21 19:16:01

标签: c#

如何使用委托System.Func< &GT ;?我们应该使用它控制funcion或事件的执行顺序吗?

简单的例子会有所帮助

5 个答案:

答案 0 :(得分:25)

假设你有一个如下函数:

private static string toLower(string s)
{
    return s.ToLower();
}

有一个版本的System.Func采用两个通用参数,第一个是第一个参数的类型,第二个是返回类型。因此,你可以写:

Func<string,string> myFunction = toLower;
string s = myFunction("AsDf"); 
// s is now "asdf"

在所有版本的System.Func中,最后一个泛型参数是返回类型,所有其他参数的类型都是依次。

System.Func非常有用,因为它不需要您编写自定义委托类型。这样可以更容易地使用相同的签名来交换代理。

说我有:

public delegate string MyDelegate1(string s);
public delegate string MyDelegate2(string s);

MyDelegate1 myDel = new MyDelegate1(toLower); // toLower as above

现在无法将MyDelegate1委托转换为MyDelegate2类型的对象,即使它们具有相同的方法签名。另一方面,如果我们使用Func而不是声明自定义委托类型,我们就不会有这个问题

答案 1 :(得分:6)

System.Func<T>通常用作另一个函数的参数。它可以是返回值T的任何委托 - 并且有多个版本可用作具有多个参数的委托。

一种常见的用法是过滤 - 例如,在LINQ中,您可以传递一个函数以用作Enumerable.Where函数中的过滤器,以限制集合。例如:

public bool FilterByName(string value)
{
    return value.StartsWith("R");
}

// .. later

List<string> strings = new List<string> { "Reed", "Fred", "Sam" };

var stringsStartingWithR = strings.Where(FilterByName);

但是,在上面的例子中,您更有可能使用lambda表达式动态构建Func<string,bool>,如下所示:

var stringsStartingWithR = strings.Where(s => s.StartsWith("R"));

答案 2 :(得分:2)

void Foo()
{
    Func<object, bool> func = Bar;
    bool b1 = func(new object()); // b1 is true
    bool b2 = func(null); // b2 is false
}

bool Bar(object o)
{
    return o == null;
}

答案 3 :(得分:1)

1)创建一个具有一个参数和一个返回值的Func实例。 2)具有两个参数和一个结果的Func实例。接收bool和int,返回字符串。 3)没有参数和一个结果值的Func实例。 4)在匿名函数上调用Invoke实例方法。

使用System;        class Program {static void Main(){

Func<int, string> func1 = (x) => string.Format("string = {0}", x);  
Func<bool, int, string> func2 = (b, x) =>
    string.Format("string = {0} and {1}", b, x);

Func<double> func3 = () => Math.PI / 2;

Console.WriteLine(func1.Invoke(10));
Console.WriteLine(func2.Invoke(true, 20));
Console.WriteLine(func3.Invoke());    } }

答案 4 :(得分:0)

用它来表示具有返回值的任何委托类型。