2012-10-11 92 views
49

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

在C++中没有引用,一切都被封装对象内是很有意义的,而不是使用它们创建对象后初始化成员。

它们在C#中的使用情况如何?

How to: Initialize Objects by Using an Object Initializer (C# Programming Guide)

+3

它是一种语法糖,用于保存一些键击并获取代码到单个可执行语句(用于像内联linq调用之类的东西)。这种风格也被用于匿名类型的创作:'new {FirstName =“Adam”,Age = 27};' –

+0

请不要包含关于问题标题中使用的语言的信息,除非在没有它的情况下没有意义。标签用于此目的。 –

+0

u编辑了18个月的问题 –

回答

13

好处是在匿名对象,LINQ查询,构造有时不用重载的使用只是为了打发参数

+0

+1它也允许对这些参数进行隐式键入,而不必在任何地方编写新的MyType(){....}。 – cirrus

+3

您也可以避开构造的不必要超载通过在构造函数中使用命名和可选参数:http://msdn.microsoft.com/en-us/library/dd264739.aspx –

89

一个经常错过好处是原子。如果您在对象上使用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中的多个键)。

+3

不会被原子如果'名字保存','LastName'和'ID'在'StudentName'的构造函数中初始化? – Songo

+2

是的,会的。上面关于原子性的说法是当你需要在构造函数外初始化对象的属性时。这种情况的一些例子是,你不能改变构造函数代码,或者你的对象有大量可选属性,而你不想创建许多重载的构造函数。 –

1

我认为它提高了可读性。

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

+2

你的答案有点混乱。它看起来像你建议使用私有setter和对象初始化语法来创建类似于只读属性的功能。如果您将setter设置为私有的,则不能将其用于对象初始化器语法,除非您在已经可以访问这些私有setter的位置使用它。 –

+0

我同意。我应该更好地表达它。要回答OP,我只是说我认为它提高了可读性。我写的其余部分有点偏离主题。我编辑了文字以试图反映这一点。 – Kirby

21

有一个潜在的原因使用对象初始化:如果初始化过程中有异常,在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"; 
    } 
+5

我最终在这篇文章中完全检查是否有人声称相同。过去几周我的团队一直在讨论这个问题。作为一名开发人员,我喜欢它提供的语法糖(上面提到的其他好处与我的上下文无关) - 但我可以接受这是一个足够强的原因而不能使用它(在我的例子中,从其他任何使用它)。 – Veverke

0

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

  • 避免大量的按键,软件程序的效率,有时按键的数量来衡量它需要写一个特定的功能。

  • 易于阅读和维护。

  • 节省时间的方法。

让在这里看到它如何能避免很多按键:

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

     } 
    }