使用对象初始化器有什么好处吗?

way*_*are 53 .net c# memory-management

使用C#对象初始化器有什么好处吗?

在C++中没有引用,并且所有内容都封装在对象中,因此在创建对象后使用它们而不是初始化成员是有意义的.

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

如何:使用对象初始化程序初始化对象(C#编程指南)

Jon*_*yna 105

一个经常遗漏的好处是原子性.如果您在对象上使用双重检查锁定,这将非常有用.对象初始化程序在初始化了您告诉它的所有成员之后返回新对象.从MSDN文章的示例:

StudentName student = new StudentName
{
    FirstName = "Craig",
    LastName = "Playstead",
    ID = 116
};
Run Code Online (Sandbox Code Playgroud)

将被翻译成如下内容:

StudentName _tempStudent = new StudentName();
_tempStudent.FirstName = "Craig";
_tempStudent.LastName = "Playstead";
_tempStudent.ID = 116;

StudentName student = _tempStudent;
Run Code Online (Sandbox Code Playgroud)

这可确保student永远不会部分初始化.它将被null初始化或完全初始化,这在多线程场景中很有用.

有关这方面的更多信息,您可以查看这篇文章.

另一个好处是它允许您创建匿名对象(例如,在LINQ中创建投影或连接多个键).

  • 如果在`StudentName`的构造函数中初始化`FirstName`,`LastName`和`ID`,是否会保留原子性? (3认同)
  • 是的,它会的.上面关于原子性的陈述是指当你需要在构造函数之外初始化对象的属性时.这样的一些示例是您无法更改构造函数代码的情况,或者您的对象具有您想要设置的大量可选属性而不创建数十个重载构造函数的情况. (3认同)

Gei*_*tad 30

有可能 使用对象初始值设定项:如果在初始化期间出现异常,则Visual Studio调试器中的调用堆栈将仅返回初始化表达式而不返回发生异常的特定行.

如果您使用具有命名不佳的异常的库或外部服务,或者使用具有本机代码的库,而您无法看到引发异常的代码(例如Android上的Xamarin),则对象初始化程序可能会使调试代码变得更加困难,因为你不知道哪个参数引发了异常.

示例:想象一下这是您的代码,但您无法读取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";
    }
Run Code Online (Sandbox Code Playgroud)

  • 我最后在这篇文章中完全是为了检查是否有人声称相同.在过去的几周里,我的团队一直在讨论这个问题.我作为开发人员确实喜欢它提供的语法糖(上面指出的其他好处与我的上下文无关) - 但我可以接受这个作为一个足够强大的理由不使用它(在我没有受益的情况下)从其他任何使用它). (7认同)

AD.*_*Net 15

好处是使用匿名对象,linq查询,有时不必要的重载构造函数只是为了传递参数

  • 您还可以通过在构造函数中使用命名和可选参数来解决构造函数的不必要重载:http://msdn.microsoft.com/en-us/library/dd264739.aspx (3认同)