Func <>委托有什么好处?

对不起,如果这是基本的,但我试图拿起。净3.5。

问题:Func <>有什么好处,它有5个重载? 从外观上看,我仍然可以用我自己的方式创建一个类似的图表,MyFunc <>,其中有5个重载,甚至更多。

例如: public delegate TResult MyFunc<TResult>()和各种重载的组合...

当我试图理解Func <>委托并触及以下情形时,想到了:

Func<int,int> myDelegate = (y) => IsComposite(10);

这意味着一个委托具有一个int类型的参数和一个int类型的返回类型。 有五种变体(如果你通过intellisense查看重载)。 所以我猜测我们可以有一个没有返回类型的委托?

那么我是否有理由说Func <>没有什么了不起,只是.Net框架中的一个例子,我们可以使用,如果需要,可以创建自定义的“func <>”代表以满足我们自己的需求?

谢谢,


伟大在于建立共同的语言以更好的沟通

代替为同一事物定义自己的委托类型(委托爆炸),请使用框架提供的委托类型。 任何读取你的代码的人都会立即掌握你正在努力完成的事情。尽量减少“这段代码实际在做什么?”的时间。 所以当我看到一个

  • 行动 =一些方法,只是做一些事情,并没有返回任何输出
  • 比较 =某种方法比较两个相同类型的对象并返回一个int来指示顺序
  • 转换器 =将Obj A转换为等效的Obj B
  • EventHandler =响应/处理程序给由某个对象引发的事件,该事件以事件参数的形式给出一些输入
  • Func =某些方法需要一些参数,计算某些内容并返回结果
  • Predicate =根据某些条件评估输入对象,并返回通过/失败状态为bool
  • 我不必深入挖掘,除非这是我最关心的问题。 因此,如果您觉得您需要的代表符合其中一项需求,请在滚动自己的代表之前使用它们。

    免责声明:我个人喜欢语言设计师的这一举动。

    反驳 :有时候定义委托可能有助于更好地交流意图。 例如通过System.Action System.Threading.ThreadStart 。 所以这是最后的判断。


    Func的代表家族(以及它们的无返回类型的表亲, Action )并不比你在.NET框架中发现的任何东西都大。 他们只是在那里重复使用,所以你不必重新定义它们。 他们有类型参数来保持通用性。 例如,Func <T0,bool>与System.Predicate <T>委托相同。 它们最初是为LINQ设计的。

    你应该能够使用内置的Func委托来接受任何返回值的方法,它最多接受4个参数,而不是为了这个目的定义你自己的委托,除非你想让名字反映你的意图,这很酷。

    绝对需要定义委托类型的情况包括接受4个以上参数的方法,带有out,ref或params参数的方法或递归方法签名(例如, delegate Foo Foo(Foo f) )。


    除了马克西米德的正确答案:

  • 值得关注Func的相关家庭, Action代表。 同样,这些类型是由类型参数的数量重载的,但声明为返回void。
  • 如果您想在.NET 2.0项目中使用Func / Action,但稍后可以通过简单的路径进行升级,则可以从我的版本比较页面中剪切并粘贴声明。 如果您在System命名空间中声明它们,那么稍后您可以通过删除声明进行升级 - 但是,如果不删除声明,您将无法(轻松)在.NET 3.5中构建相同的代码。
  • 链接地址: http://www.djcxy.com/p/52835.html

    上一篇: What's so great about Func<> delegate?

    下一篇: Does passing a struct into an interface field allocate?