使用C#对象初始化器有什么好处吗?
在C ++中没有引用,所有内容都封装在一个对象中,因此在创建对象后使用它们而不是初始化成员是有意义的。
在C#中使用它们的情况如何?
How to: Initialize Objects by Using an Object Initializer (C# Programming Guide)
答案 0 :(得分:100)
一个经常遗漏的好处是原子性。如果您在对象上使用double-checked locking,这将非常有用。对象初始化程序在初始化了您告诉它的所有成员之后返回新对象。从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
或完全初始化,这在多线程场景中很有用。
有关此问题的详情,请查看this文章。
另一个好处是它允许您创建匿名对象(例如,在LINQ中创建投影或连接多个键)。
答案 1 :(得分:31)
不使用对象初始值设定项的可能原因:如果在初始化期间出现异常,则Visual Studio调试器中的调用堆栈将仅返回初始化表达式而不返回异常的特定行发生。
如果您使用具有命名不佳的异常的库或外部服务,或者使用具有本机代码的库,而您无法看到引发异常的代码(例如Android上的Xamarin),则对象初始化程序会使其变得更难调试代码,因为你不知道哪个参数导致抛出异常。
示例:想象一下这是您的代码,但您无法读取ExternalService的来源,因为它在您的应用程序外部。你不会知道这是"查理"在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";
}
答案 2 :(得分:15)
使用匿名对象,linq查询,有时不必重载构造函数只是为了传递参数
答案 3 :(得分:1)
我认为它提升了可读性。
作为旁注,在所示链接中给出的示例中,我有时更喜欢为属性(FirstName和LastName)设置私有setter,但这取决于您的设计。
答案 4 :(得分:0)
对象初始化有三个主要好处
避免大量击键,软件程序的效率有时通过编写特定函数所需的击键次数来衡量。
易于阅读和维护。
节省时间的方法。
让我们看看如何避免大量击键:
在c#3.0之前,我们正在进行这样的初始化 -
public class Employee
{
public string Name { get; set; }
public int Id { get; set; }
public string Department { get; set; }
public int salary { get; set; }
}
class Program
{
static void Main(string[] args)
{
Employee emp=new Employee();
emp.Name = "Kumar";
emp.Department = "IT";
emp.Id = 101;
emp.salary = 80000;
Console.ReadLine();
}
}
现在在c#3.0之后,我们将按如下方式在一行中初始化。
class Program
{
static void Main(string[] args)
{
Employee emp = new Employee {Name = "Kisan",Id = 55,Department = "IT",salary = 20000};
}
}