使用Func<> (或Action<>)或创建自己的委托?

时间:2010-12-16 07:32:25

标签: c# .net delegates coding-style func

在方法中的参数类型(与LINQ无关)中哪个更好。 显然Func更好,因为它更简单,更具描述性,如果每个人都在使用它,一切都将变得兼容(好)。 但是我注意到Microsoft在某些库中使用自己的委托,例如事件处理程序。那么,它们中的任何一个的优点和缺点是什么?我应该什么时候使用它?

编辑:

  • 显然是Func<>仅在3.5中可用,所以这可能是我看到非Func代表的主要原因。任何其他不使用Func的原因? (示例:this来自.NET4)

  • 同样的问题也适用于Action<>

5 个答案:

答案 0 :(得分:5)

函数功能<>当它非常清楚它们的用途是什么时很有用,并且输入的数量很少。

当输入的数量较大,或者意图可能存在一些歧义时 - 那么使用带有命名参数的委托可以使事情更加清晰。

答案 1 :(得分:1)

它们用于所有目的相同,除非方法具有Expression参数。那些需要被定义为'lambda'而不是delegate。在处理IQueryable并获取IEnumerable而不是调用/解析时(例如LINQ2SQL),这将是非常有问题的。

答案 2 :(得分:1)

函数功能<>和行动<>如果它们在您的情况下实际适用,则更可取。 运行时创建程序中使用的每种类型的实例,如果使用Func,则表示创建了类型实例。在自定义委托的情况下,事情会以不同的方式进行,并且即使它们与现有的类型基本相似,也会创建新的类型。

然而,有时自定义代表会使代码更清晰。

答案 3 :(得分:1)

  

但是我注意到Microsoft在某些库中使用自己的委托,例如事件处理程序。那么,它们中的任何一个的优点和缺点是什么?我应该什么时候使用它?

其中一些是历史性的:在添加Action<>Func<>时在C#3 / .NET3之前定义的API。对于事件EventHandler<T>是事件的更好选择,因为它强制执行正确的约定。

答案 4 :(得分:0)

您始终可以创建一个类,该类将n个输入保存为类属性,并在func&lt;&gt;中将单个输入传递给类的对象。代表