使用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中创建投影或在多个键上进行连接)。
StudentName
的构造函数中初始化FirstName
、LastName
和ID
,那么原子性不就得以保留了吗? - Songo不使用对象初始化器的一个潜在原因是:如果在初始化过程中出现异常,Visual Studio调试器中的调用堆栈将仅返回初始化表达式而不是引发异常发生的特定行。
如果您使用具有名称不当的异常的库或外部服务,或者使用具有本地代码的库(例如在Android上的Xamarin)而无法查看引发异常的代码,则对象初始化器可能会使调试代码更加困难,因为您不知道哪个参数导致引发异常。
例如:假设这是您的代码,但您无法阅读ExternalService的源代码,因为它是外部应用程序。您将不知道导致ExternalService中出现错误的参数是"charlie"。
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查询以及有时不必要地重载构造函数仅为了传递参数的使用有其优点。
对象初始化有三个主要优点:
让我们看看它如何避免大量按键:
在 C# 3.0 之前,我们进行初始化的方式如下:
Employee emp = new Employee();
emp.Name = "Kumar";
emp.Department = "IT";
emp.Id = 101;
emp.Salary = 80000;
Employee emp = new Employee { Name = "Kumar", Department = "IT", Id = 101, Salary = 80000 };
我认为这有助于提高可读性。
顺便说一下,在链接中给出的示例中,我有时倾向于为属性(FirstName和LastName)设置私有setter,但这取决于您的设计。
new { FirstName = "Adam", Age = 27 };
- Adam Houldsworth