c# - 使用初始化 block 不好吗

标签 c# coding-style initialization

您好,我在 C# 中使用初始化程序 block

new Something { foo = 1, bar = 2 };

但人们说这是不好的做法。

我不认为这是错误的,是吗?

最佳答案

您需要问问自己,您的类型是否应该是可变的。就我个人而言,我喜欢不可变类型——它们更容易推理正在发生的事情,更容易验证(一旦构造函数被调用并且状态被验证,你知道它不会变得无效)并且它们非常适合并发。

另一方面,对象初始值设定项在合理使用可变类型的情况下肯定有用。例如,ProcessStartInfo 被有效地用作 Process 的构建器类型。能够编写是很有用的:

var info = new ProcessStartInfo { 
    FileName = "notepad.exe",
    Arguments = "foo.txt",
    ErrorDialog = true
};
Process process = Process.Start(info);

事实上,您甚至可以内联完成所有这些操作,而无需使用额外的变量。我的 Protocol Buffer 端口使用相同类型的模式:

Foo foo = new Foo.Builder { 
    FirstProperty = "first",
    SecondProperty = "second"
}.Build();

现在构建器模式的另一种选择是构造函数参数(可能通过工厂方法)。这样做的历史缺点是您需要不同的重载,具体取决于设置的属性,如果多个参数具有相同的类型,则很难区分哪个是哪个。 C# 4 使用可选参数和命名参数使这变得更加容易。例如,如果您正在构建一个电子邮件类,您可以:

Email email = new Email(
    from: "skeet@pobox.com",
    to: "jon@example.com",
    subject: "Test email",
    body: textVariable
);

在清晰度方面,这与对象初始化器有许多相同的好处,但没有可变性损失。上面的构造函数调用可能遗漏了一些可选参数,例如附件和密件抄送列表。我认为对于我们这些既喜欢不变性又喜欢对象初始化器的清晰度的人来说,这将证明是 C# 4 的最大好处之一。

关于c# - 使用初始化 block 不好吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2574725/

相关文章:

c# - 我应该只将 ID 存储到 Redis 中,然后使用 ID 查询 SQL

python - Pylint 无效的常量名

vb.net - VB 代码应该有多宽?

c - 初始化动态分配的整数

c# - 在页面加载时禁用下拉列表

c# - 如何在 MainPage 中调用异步方法

java - 初始化多个 JFrame 会创建空白 JFrame

python - 使用父实例初始化子实例

c# - 列表框可以显示为表格吗

ruby - 仅在存在时修改 Ruby 散列中的值