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 <>”代表以满足我们自己的需求?
谢谢,
伟大在于建立共同的语言以更好的沟通 。
代替为同一事物定义自己的委托类型(委托爆炸),请使用框架提供的委托类型。 任何读取你的代码的人都会立即掌握你正在努力完成的事情。尽量减少“这段代码实际在做什么?”的时间。 所以当我看到一个
我不必深入挖掘,除非这是我最关心的问题。 因此,如果您觉得您需要的代表符合其中一项需求,请在滚动自己的代表之前使用它们。
免责声明:我个人喜欢语言设计师的这一举动。
反驳 :有时候定义委托可能有助于更好地交流意图。 例如通过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)
)。
除了马克西米德的正确答案:
Action
代表。 同样,这些类型是由类型参数的数量重载的,但声明为返回void。 System
命名空间中声明它们,那么稍后您可以通过删除声明进行升级 - 但是,如果不删除声明,您将无法(轻松)在.NET 3.5中构建相同的代码。 上一篇: What's so great about Func<> delegate?
下一篇: Does passing a struct into an interface field allocate?