- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
有两种实现重载的方法。第一个是在一个方法/构造函数中执行所有操作并从其他重载调用它,这会导致更长的方法体。第二个是在每个重载中做最少的事情,因此有时代码难以导航并且理解哪个重载做了什么。
例如,如果类 Cat
的两个重载是:
public Cat(string name, int? weight, Color mainColor);
public Cat(string name);
有两种实现方式:
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.
}
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);
}
注意:由于 C# 4.0 允许您指定可选参数,为避免歧义,假设我只讨论 C# 3.0。
最佳答案
我认为这是另一个例子,其中没有一个单一的、教条的答案可以合理地涵盖所有情况。我总是会查看个案并根据所有可用因素做出决定。
一个因素是第一个有很多如果。您的代码也有一个错误:您将在颜色列表中添加一个 null
值;为了修复那个错误,你需要更多的ifs。这样的构造函数很容易变得困惑。无数的 if 表明有几种情况的逻辑大不相同,因此为每种情况使用单独的构造函数是非常有意义的。
然而,在没有那么多 if 的情况下,所有逻辑都是相同的,所以现在调用一个构造函数来执行那个逻辑并且做得很好是有意义的。然后只有一个地方可以维护它。
另一个因素是,在您的示例中,第一个未初始化 weight
。 这不一定是坏事,因为幸运的是 C# 中的默认初始化是可预测的;但如果 weight
的字段声明将其初始化为非零值并且只有一些构造函数用另一个值覆盖该默认值,我会认为它是错误的形式。构造函数参数和/或 this(...)
调用是记录该字段默认值的更好位置。 (最好是构造函数参数,因为那样即使客户端程序员也能看到默认值,但显然这需要 C# 4。)当然,也可以初始化所有使用字段初始化器的字段并将构造函数留空,如果您只有一个没有参数的构造函数,这是一种合理的策略。
是的,正如您所说,您不希望方法体变得太长,但您也不希望代码变得太难以导航,因此您需要在两者之间取得平衡给定的情况。
关于c# - 如何在一个带有被动重载的大方法和一堆小的重载之间做出选择,每个方法都做少量的工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3793316/
我创建了一个库项目,然后构建它,获取 .aar 并解压缩它。获取包含库的 classes.jar 文件,并将其添加到另一个项目中。该项目识别我的文件,我可以从中调用方法和函数。我的问题是我尝试从我的库
这不是现实世界的问题,我只是想了解如何创建 promise 。 我需要了解如何为不返回任何内容的函数做出 promise ,例如 setTimeout。 假设我有: function async(ca
我是 Promise 的新手。我写了两个例子: 第一个是: new RSVP.Promise(function (resolve, reject) { setTimeout(function
我有一个 nodejs (express) 作为服务器端,一个 angular 6 作为客户端。在服务器中我有中间件功能,可以进行 session 检查。如果 session 无效或不存在,我想向客户
我有一个 nodejs (express) 作为服务器端,一个 angular 6 作为客户端。在服务器中我有中间件功能,可以进行 session 检查。如果 session 无效或不存在,我想向客户
我有四个 I/O 操作:A、B、C 和 D。它们中的每一个都应该使用 vertx.executeBlocking 来执行。我应该有以下行为: //PSEUDOCODE waitForExecuteBl
我是一名优秀的程序员,十分优秀!