使用 C# 对象初始化器有什么好处吗?
在 C++ 中没有引用,所有内容都封装在对象中,因此使用它们而不是在对象创建后初始化成员是有意义的。
它们在 C# 中的用途是什么?
使用 C# 对象初始化器有什么好处吗?
在 C++ 中没有引用,所有内容都封装在对象中,因此使用它们而不是在对象创建后初始化成员是有意义的。
它们在 C# 中的用途是什么?
一个经常被忽略的好处是原子性。如果您在对象上使用双重检查锁定,这很有用。对象初始化器在初始化您告诉它的所有成员后返回新对象。从 MSDN 文章中的示例:
StudentName student = new StudentName
{
FirstName = "Craig",
LastName = "Playstead",
ID = 116
};
将被翻译成如下内容:
StudentName _tempStudent = new StudentName();
_tempStudent.FirstName = "Craig";
_tempStudent.LastName = "Playstead";
_tempStudent.ID = 116;
StudentName student = _tempStudent;
这确保student
永远不会部分初始化。它将被null
初始化或完全初始化,这在多线程场景中很有用。
有关这方面的更多信息,您可以查看这篇文章。
另一个好处是它允许您创建匿名对象(例如,创建投影或加入 LINQ 中的多个键)。
不使用对象初始化程序的一个潜在原因是 :如果初始化期间出现异常,Visual Studio 调试器中的调用堆栈将仅返回初始化程序表达式,而不是发生异常的特定行。
如果您使用的库或外部服务的异常命名很糟糕,或者在您看不到引发异常的代码的情况下使用带有本机代码的库(例如 Android 上的 Xamarin),那么对象初始化程序会使您的代码更难调试,因为您不知道哪个参数导致抛出异常。
示例:想象这是您的代码,但您无法读取 ExternalService 的源代码,因为它在您的应用程序外部。您不会知道是“charlie”参数导致了 ExternalService 中的错误。
var instance = new ClassToBeInitialized
{
alpha = "alpha",
bravo = ExternalService(0),
charlie = ExternalService(1)
};
private static string ExternalService(int parameter)
{
if (parameter == 1)
{
throw new Exception("The external service crashed");
}
return "correctStringResult";
}
好处是使用匿名对象、linq 查询,有时只是为了传递参数而不必要地重载构造函数
对象初始化有 3 个主要好处
让我们在这里看看它如何避免大量击键:
在 C# 3.0 之前,我们是这样进行初始化的:
Employee emp = new Employee();
emp.Name = "Kumar";
emp.Department = "IT";
emp.Id = 101;
emp.Salary = 80000;
现在在 C# 3.0 之后,我们将在一行中初始化如下:
Employee emp = new Employee { Name = "Kumar", Department = "IT", Id = 101, Salary = 80000 };
我认为它提高了可读性。
作为旁注,在显示的链接中给出的示例中,我有时更喜欢为属性(名字和姓氏)使用私有设置器,但这取决于您的设计。