如何在一个带有被动过载的大方法和一堆小过载之间做出选择,每个方法都做了少量的工作?

Ars*_*nko 7 .net c# overloading

有两种方法可以实现重载.第一个是在一个方法/构造函数中执行所有操作,并从其他重载调用它,这会导致更长的方法体.第二个是在每个重载中做最小的,因此有时难以导航代码并且理解哪个重载做了什么.

例如,如果一个类的两个重载Cat是:

public Cat(string name, int? weight, Color mainColor);
public Cat(string name);
Run Code Online (Sandbox Code Playgroud)

有两种方法可以实现这个:

第一种

public Cat(string name, int? weight, Color mainColor)
{
    // Initialize everything.
    this.name = name;
    if (weight.HasValue) this.weight = weight.Value;

    // There is a bug here (see the anwer of @Timwi): mainColor can be null.
    this.colors = new List<Colors>(new[] { mainColor });
}

public Cat(string name)
    : this(name, null, null)
{
    // Nothing else to do: everything is done in the overload.
}
Run Code Online (Sandbox Code Playgroud)

第二种

public Cat(string name)
{
    // Initialize the minimum.
    this.name = name;
    this.colors = new List<Colors>();
}

public Cat(string name, int? weight, Color mainColor)
    : this(name)
{
    // Do the remaining work, not done in the overload.
    if (weight.HasValue) this.weight = weight.Value;
    this.colors.Add(mainColor);
}
Run Code Online (Sandbox Code Playgroud)

问题

  1. 如何调用这两种类型的重载(以便能够在互联网或书籍中查找更多信息)?
  2. 在这些类型之间进行选择时,必须考虑的主要问题/因素是什么?

注意:由于C#4.0允许您指定可选参数,为避免歧义,假设我只是在讨论C#3.0.

Tim*_*mwi 3

我认为这是另一个例子,没有一个单一的、教条的答案能够合理地涵盖所有情况。我总是会根据具体情况并根据所有可用因素做出决定。

\n\n

一个因素是第一个有很多如果。您的代码还有一个错误:您将null在颜色列表中添加一个值;为了修复这个错误,你需要更多的假设。这样的构造函数很容易变得混乱。无数的 if 表明有几种情况的逻辑有很大不同,因此为每种情况使用单独的构造函数是非常有意义的。

\n\n

但是,在存在 xe2\x80\x99t 那么多 if 的情况下,所有逻辑都是相同的,因此现在调用单个构造函数来执行该逻辑并且做得很好是有意义的。然后\xe2\x80\x99s只有一个地方维护它。

\n\n

另一个因素是,在您的示例中,第一个因素未weight初始化。这不一定是一件坏事,因为幸运的是 C# 中的默认初始化是可以预测的;但如果 的 字段声明weight将其初始化为非零值并且只有某些构造函数用另一个值覆盖该默认值,我会认为这种形式很糟糕。构造函数参数和/或调用this(...)是记录该字段的默认值的更好位置。(最好是构造函数参数,因为这样即使客户端程序员也可以看到默认值,但显然这需要 C# 4。)当然,也可以使用字段初始化程序初始化所有字段并将构造函数保留为空,如果只有一个不带参数的构造函数,这是一种合理的策略。

\n\n

所以是的,就像你说的,你不希望方法体变得太长,但你也不希望代码变得太难以导航,所以你需要取得平衡对于任何特定情况,两者之间。

\n