Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么Func和Action委托只接受4个参数?_C# - Fatal编程技术网

C# 为什么Func和Action委托只接受4个参数?

C# 为什么Func和Action委托只接受4个参数?,c#,C#,为什么是4?我知道它在文档中是4,但这似乎很奇怪。很奇怪,人们需要在一个类中使用四种类型的对象,封装它们,操纵它们,并跟踪它们 我甚至认为,除了三种不同的类型之外,您的泛型类已经走得太远了。通常你必须考虑你的类型如何相互作用的排列,例如,1个类型可以,1 x 2可以,3个你有6种方式来操作你的类型,4个你有24种组合可供选择,所以你也应该考虑到这种复杂性。我不知道确切的答案,但我猜这与这样一个事实有关:如果你传递的委托参数大于4个,那么这就是一种代码味道,你可能做错了什么。你应该考虑使用“重构”

为什么是4?我知道它在文档中是4,但这似乎很奇怪。

很奇怪,人们需要在一个类中使用四种类型的对象,封装它们,操纵它们,并跟踪它们


我甚至认为,除了三种不同的类型之外,您的泛型类已经走得太远了。通常你必须考虑你的类型如何相互作用的排列,例如,1个类型可以,1 x 2可以,3个你有6种方式来操作你的类型,4个你有24种组合可供选择,所以你也应该考虑到这种复杂性。

我不知道确切的答案,但我猜这与这样一个事实有关:如果你传递的委托参数大于4个,那么这就是一种代码味道,你可能做错了什么。你应该考虑使用“重构”。

< P>我会走出来,说是因为有人需要一个行动或FUNC委托,在框架中有4个参数,没有人需要一个5。或者,有人决定超过4个参数,你应该引入一个类来保存这些值,就像@chadmyers所说的。

首先,我同意其他人的观点,一个带有5个参数的函数签名可能有点长。话虽如此,作为一名开发人员,我已经写了很多长函数签名

您始终可以编写自己的重载泛型委托。你们甚至可以把它们放在系统中(我不会)

名称空间系统
{
公共委托无效操作(T1 arg1、T2 arg2、,
T3 arg3、T4 arg4、T5 arg5);
公共代表返回操作(T1 arg1,
T2 arg2、T3 arg3、T4 arg4、T5 arg5);
}

编辑:自从我写了这篇文章.NET4。已经到达了,并且有了这些委托的更长版本。

因为有这么多参数的委托是一种糟糕的开发模式。
它使您的代码极为耦合和复杂。

在.NET4.0中,您可以获得更多功能


尽管在可读性方面,使用这样的例行公事可能有点过分…

你能解释一下为什么你需要4个以上吗?@Jon Limjap,你能解释一下为什么你需要3个以上吗?也就是说,为了建立数学预测模型,根据提供的基因代码将函数展开到代理中)我实际上不需要。我只是好奇。在.net框架中发现这样的硬编码和限制是很奇怪的,我想知道它背后是否有某种逻辑。一些比“任何超过这一点,你的代码都会有味道”更为实质性的东西。好极了,这更可能是一个简单务实的选择,可能会在未来发生变化,而不是像“如果你需要超过四个,你就错了”这样的假设原则性答案。当然,如果需要17个参数,添加自己的Func重载就很容易了。但是4似乎是一个很好的折衷方案,它以最少的额外代码添加到BCL中来覆盖最常见的用例。
namespace System
{
  public delegate void Action<T1, T2, T3, T4, T5>(T1 arg1, T2 arg2, 
                                                  T3 arg3, T4 arg4, T5 arg5);
  public delegate ReturnT Action<ReturnT, T1, T2, T3, T4, T5>(T1 arg1, 
                                         T2 arg2, T3 arg3, T4 arg4, T5 arg5);
}