使用Object Initializer有什么好处吗?

使用C#对象初始值设定项有什么好处吗?

在C ++中没有引用,所有东西都封装在一个对象中,因此在创build对象之后使用它们而不是初始化成员是有意义的。

他们在C#中使用的情况是什么?

如何使用对象初始值设定项初始化对象(C#编程指南)

人们经常错过的好处是primefaces性 。 如果您在对象上使用双重检查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或完全初始化,这在multithreading场景中很有用。

欲了解更多信息,你可以看看这篇文章。

另一个好处是,它允许你创build匿名对象(例如,创build投影或joinLINQ中的多个键)。

有没有可能的原因使用对象初始值设定项:如果在初始化过程中有一个exception,Visual Studiodebugging器中的调用堆栈将只返回初始值设定项expression式而不是返回exception发生的特定行。

如果您使用的库或外部服务的名称不正确,或者使用带有本机代码的库,而您无法看到引发该exception的代码(例如Android上的Xamarin),则对象初始化程序可能会使debugging代码变得更加困难,你不知道哪个参数导致exception被抛出。

示例:想象一下,这是您的代码,但您无法读取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查询,有时不必重载构造函数来传递参数

我认为它提高了可读性。

作为一个侧面说明,在所示的链接示例中,我有时更喜欢为属性(FirstName和LastName)设置私有的setter,但这取决于您的devise。

对象初始化有三个主要的好处

  • 避免大量的击键,软件程序的效率有时是通过编写特定function所需的按键次数来衡量的。

  • 易于阅读和维护。

  • 节省时间的方法。

让我们看看这里如何避免很多击键:

在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}; } }