C#中的函数重载是个好主意吗?

时间:2016-04-08 01:22:48

标签: c#

所以我有一种情况,根据我想要的最终结果,我需要不同数量的函数参数。

我是C#的新手,并且听说过重载函数,这是我之前没见过的(我从JavaScript开始)。

但它看起来有点脏,即使它确实有效,也不是一个好的做法。使用重载函数通常不是一个好主意,我可能会做更多工作的替代方案,但重载会让生活更轻松。

使用多个具有相同名称的方法感觉非常不舒服。这些是标准功能和可接受的代码实践吗?或者它可能导致未来的一些混乱问题,我的缺乏经验还不知道,因此我应该避免它?

5 个答案:

答案 0 :(得分:5)

  

功能重载。

实际命名方法重载。 C#与返回值的方法没有直接区别,而没有返回值。因此方法

  

但它看起来有点脏

这是该语言的一个关键组成部分,这是一种常见的做法,绝对不会令人不悦。

  即使它确实有效,也不是一个好的做法。

这个想法是为消费者提供不同的变体。一个消费者可能只有X型才能使用,而只提供Y型。通过提供更多,库和/或实例更灵活。此外,它通过让消费者转换数据以使其进入方法来解决失败点。

  

(我从JavaScript开始)。

请勿尝试使用习惯使用的语言的 style 进行编程。使用所设计的任何新语言的特定功能。通过尝试在C#中使用Java或在C#中使用Ruby是愚蠢的。所有语言都有自己的设计点...程序语言,而不是编程风格。

  

使用多个具有相同名称的方法感到非常不舒服。

来自非 type 安全的语言,这是一种可以理解的反应。但请记住,编译器正在强制执行安全,以便小部件X仅与小部件X匹配;这是一个真正的功能,而不是一个噱头。

坦率地说,当我看到不提供多次重载的代码时,我将其视为开发人员的懒惰或某些上帝可怕的时间紧缩,因此匆忙的代码。

不要太过分了......只需提供足够的重载,使大多数消费者都可以使用该类。

  

或者它可能在将来导致一些混乱的问题

如果一个人不一致,可能是的。

因此,在变量的位置上保持一致。如果int启动方法,则另一种方法也应该以相同的int开头;如果提供。不要混合订单。

答案 1 :(得分:1)

因此,您所使用的语言的核心功能会让您更容易......并且您对此感到担忧?我不会太担心。

尝试尝试可能是个主意,一旦你对它感到满意,就可以将其转交给codereview.stackexchange.com以获得一些反馈。

答案 2 :(得分:1)

考虑以下课程:

public class MyClass 
{
    public void MyMethod(int a, object b)
    {
    }
}

如果其他人像这样打电话给你的班级:

new MyClass().MyMethod(1, 1);

然后在你的程序集的未来版本中添加一个无辜的重载:

public class MyClass 
{
    public void MyMethod(int a, object b)
    {
    }

    public void MyMethod(object a, int b)
    {
    }
}

其他人的代码无法针对新程序集进行编译。

你是正确的,方法重载可能会引入问题......但它并不总是有问题。

假设这个简单的案例 - 你有一个方法可以在Type - T上运行。如果您想添加方法重载来处理第二个Type U,请考虑哪些接口和基类TU可能有共同点(包括{{1}或T彼此延伸)。如果有一个共同的U,请考虑在设计时制作参数类型(如果这足够具体)。如果没有,那么您可能需要方法重载。一个好的人为例子可能是一个返回数字平方的方法。 TypeType运算符(你可以用C#编写自己的运算符)没有通用抽象。所以你必须制作(2)方法来处理*int

double

但是,如果您发现自己希望在public int SquareMe(int x) { return x * x; } public double SquareMe(double x) { return x * x; } List<T>IEnumerable<T>上运行某个方法,那么最好不要编写接受{{1 (并且只是立即调用T[]以防止IEnumerable<T>多次扩展(如果您的代码多次需要它) - 如果您只是ToArray()一次,那么不需要扩展它)这样你只剩下(1)方法来编写测试。每种方法,特别是公开使用的API,更多的是维护,记录,测试,自动化等。更简单通常更好(但复杂性也有它的位置)。给出API的设计算法很困难(如果有这样的事情的现有算法,我们可以将设计生成为某个假设程序的输出,是吗?)

当涉及到为公共消费设计类和接口时,你应该非常小心方法重载(而且你的整个API,一般来说 - 方法重载引入微妙的重大改变只是一件事要考虑 - 几乎任何改变都可能是一个突破性的变化)。如果您的API(例如Microsoft)使用了您的API,那么对API的所有更改都必须经过深思熟虑并且最少有0次更改。

如果它是用于“内部”使用(并且你可以在构建时检测编译中断),那么如果编译器很高兴,那么方法重载本身就不应该太大。话虽如此 - 由于C#会选择什么,有人可能会意外地称之为不同的过载。有明确的方法名称(微软建议在C#中拼写出来的东西)可能更为重要,它直观地(即主观地)匹配方法的内容而不是重载的内容。

与其他事物一样,这种语言特征是在显性和隐性之间的权衡,以及它是否是一个好主意在情况上有所不同;方法重载既可以使用也可以被滥用。一般来说,在开发自己的风格之前,先尝试学习新语言的现有实践,模式和文化,这样你就可以利用每个人的成功和失败。方法重载肯定在C#中占有一席之地。

答案 3 :(得分:0)

如果改变签名的原因是因为“你想要的最终结果”不同,那么就是具有不同功能的情况。

当您有许多可选参数时,重载非常有用。如果你有五个可选参数,那么如果你指定一些而不指定其他参数会发生什么不太明显。如果您创建了重载,那么您可以使用所需参数提供该函数的不同版本。也许在幕后,他们都可以使用可选参数调用私有方法,但这仍然不为公众使用。

答案 4 :(得分:-1)

为什么不使用可选参数?

2016-04-07 19:20:52,44.679734706
2016-04-07 19:20:53,44.65862894
2016-04-07 19:20:54,44.668009281
2016-04-07 19:20:55,44.462228059
2016-04-07 19:20:57,45.116506814
2016-04-07 19:20:58,44.847994565
...