对Func,Delegates和Anonymous类型感到困惑

时间:2014-01-02 05:22:03

标签: c# delegates func

从书中读取这行代码示例:

Func<string,int> returnLength;
returnLength = delegate (string text) { return text.Length; };

Console.WriteLine(returnLength("Hello"));

它说

  

Func<string,double,int>等同于表单的委托类型   public delegate int SomeDelegate(string arg1, double arg2)

那么Func是代表吗?然后我们在代码示例中再次定义了什么代理? 我们从Func定义一个类似于delegate的变量,然后再将其分配给另一个delegate?我非常困惑,无法理解这个概念。 :(

有人可以解释一下吗?

4 个答案:

答案 0 :(得分:4)

所以Func是委托人吗?

是的,它的定义如下:

public delegate TResult Func<in T, out TResult>(T arg)

它被描述为:

  

封装具有一个参数并返回值的方法   TResult参数指定的类型。

阅读Func Delegate了解更多信息。

那么我们在代码示例中再次定义了什么代理?

这是我们创建的anonymous method,用于将其分配给Func类型的变量。只要输入和返回类型与Func泛型参数匹配,您也可以使用命名方法或lambda expression

我们从Func定义一个类似委托的变量,然后再将其分配给另一个委托?

不,我们创建一个变量键入 Func<string, int>,然后创建一个匹配该类型的委托并将其分配给变量。


来自MSDN的其他来源:

答案 1 :(得分:1)

你可以写的相同代码

Func<string,int> returnLength = (s) => {return s.Length;}

将委托分配给Func就像将变量分配给另一个......

答案 2 :(得分:1)

您的代码也可以这样表达:

Func<string,int> returnLength = delegate (string text) { return text.Length; };

Console.WriteLine(returnLength("Hello"));

func是代表。

  1. Func<string, int>是声明,
  2. delegate (string text) { return text.Length; }是您要分配的功能。
    1. 此委托(函数)接受字符串(string text)并返回一个整数(return text.Length;)。
  3. 这将返回5作为text.Length of“Hello”为5.这不是因为你在这个例子中创建了2个委托,而是你只是分配一个。

答案 3 :(得分:1)

是的,Func等同于具有返回类型的delegate类型。您定义的delegate是调用方法返回delegate类型时执行的int

这可以快捷方式下载到

Func<string, int> returnLength = (text) => { return text.length; };

在这种情况下,委托返回值类型int(Int32)

现在,Action也是一个没有返回值的委托类型,例如。

Action<string> action = delegate(string text) { text = ""; };

Action<string> action = (text) => { text = ""; };

现在,匿名类型与delegateActionFunc大不相同。现在Func&amp;代表们介绍后,{。}}在.Net 3.5中实施。