【问题标题】:Confused about Func, Delegates and Anonymous types对 Func、Delegates 和 Anonymous 类型感到困惑
【发布时间】:2014-01-02 13:38:28
【问题描述】:

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

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

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

上面写着

Func&lt;string,double,int&gt; 等价于表单的委托类型 public delegate int SomeDelegate(string arg1, double arg2)

所以Func 是代表?那么我们在代码示例中再次定义的那个委托是什么? 我们从Func 定义一个变量,就像delegate,然后将它再次分配给另一个delegate?我非常困惑,无法理解这个概念。 :(

谁能解释一下?

【问题讨论】:

  • Func 是一个具有某种返回类型的委托..
  • 我在你的代码中看不到任何匿名类型。
  • @MarcinJuraszek:returnLength 被分配了一个匿名代表。 OP 很困惑,改用了“匿名type”这个词。
  • @Gabe 好的,我现在明白了。但要 100% 正确,他所指的东西称为 anonymous method,而不是 anonymous delegate。请参阅 MSDN:msdn.microsoft.com/en-us/library/0yw3tz5k.aspx

标签: c# delegates func


【解决方案1】:

所以Func 是代表?

是的,定义如下:

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

描述为:

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

阅读Func Delegate了解更多信息。

那么我们在代码示例中再次定义的那个委托是什么?

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

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

不,我们创建一个类型为 Func&lt;string, int&gt; 的变量,然后创建一个与该类型匹配的委托并将其分配给该变量。


来自 MSDN 的其他来源:

【讨论】:

    【解决方案2】:

    您可以编写相同的代码

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

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

    【讨论】:

      【解决方案3】:

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

      这可以简化为

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

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

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

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

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

      现在匿名类型与delegateActionFunc 有很大不同。现在 FuncAction 在引入代表后在 .Net 3.5 中实现。

      【讨论】:

        【解决方案4】:

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

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

        一个 func 是一个委托。

        1. Func&lt;string, int&gt; 是声明,
        2. delegate (string text) { return text.Length; } 是您分配的功能。
          1. 此委托(函数)接受一个字符串 (string text) 并返回一个整数 (return text.Length;)。

        这将返回 5,因为 "Hello" 的 text.Length 为 5。这不是因为您在此示例中创建了 2 个委托,而是您只是分配了一个。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-19
          • 1970-01-01
          相关资源
          最近更新 更多