c# - 方法重载还是更优雅的东西?

标签 c# overloading named-parameters

<分区>

我正在用 C# 编写一些代码,我注意到如下场景。我想知道如何才能使它更优雅且更易于维护。

如果我有以下重载场景

public void DoSmtg(string a) { DoSmtg(a, 0, 0f); }
public void DoSmtg(string a, int x) { DoSmtg(a, x, 0f); } 
public void DoSmtg(string a, int x, double d) { // method logic }

说现在我需要添加另一个 bool 参数。我必须将其修改为

public void DoSmtg(string a) { DoSmtg(a, 0, 0f, false); }
public void DoSmtg(string a, int x) { DoSmtg(a, x, 0f, false); } 
public void DoSmtg(string a, int x, double d, bool doIt) { // method logic }

这是一个非常简单的例子。可以说 DoSmtg() 方法还有 10 个版本。显然,这段代码有味道。虽然重载非常有效,但显然很难维护此代码,因为:

  1. 要写的方法很多

  2. 在仔细调查之前调用哪个方法并不明显(特别是如果方法有更多参数)

  3. 方法因不断增长的参数列表而受到污染

  4. 添加的新参数需要在很多地方进行更改(想想从许多不同位置调用的上述方法)

避免这种情况的优雅、简单且好的方法是什么?

最佳答案

您可以尝试在一个函数中添加所有参数,使用默认值并在调用该函数时命名参数:

public void DoSmtg(string a, int x=0, double d=0f, bool doIt=false) { 
    // method logic 
}

调用该函数时,您将执行:

DoSmtg("yo!")
DoSmtg("yo!", d:0.59, doIt:true)

关于c# - 方法重载还是更优雅的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37709059/

相关文章:

c# - Linq IEnumerable<IGrouping<string, Class>> 回到 List<Class>

c# - 为什么我在定义自定义配置文件时收到 TypeLoadException?

c++ - 函数重载和模板

scala - 根据scala中的其他参数定义默认命名参数

C - 具有命名参数的函数指针类型

scala - Scala 如何知道调用什么方法(命名参数)

c# - 关于新特性的开闭原则

java - 使用泛型重构多个重载方法

c++ - 使用父类的重载方法

c# - 不确定何时使用抽象属性,何时不使用