62

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

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

它们在 C# 中的用途是什么?

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

4

5 回答 5

112

一个经常被忽略的好处是原子性。如果您在对象上使用双重检查锁定,这很有用。对象初始化器在初始化您告诉它的所有成员后返回新对象。从 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 中的多个键)。

于 2012-10-11T14:55:21.573 回答
43

使用对象初始化程序的一个潜在原因是 :如果初始化期间出现异常,Visual Studio 调试器中的调用堆栈将仅返回初始化程序表达式,而不是发生异常的特定行。

如果您使用的库或外部服务的异常命名很糟糕,或者在您看不到引发异常的代码的情况下使用带有本机代码的库(例如 Android 上的 Xamarin),那么对象初始化程序会使您的代码更难调试,因为您不知道哪个参数导致抛出异常。

示例:想象这是您的代码,但您无法读取 ExternalService 的源代码,因为它在您的应用程序外部。您不会知道是“charlie”参数导致了 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";
    }
于 2015-06-09T11:26:45.497 回答
16

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

于 2012-10-11T14:51:49.437 回答
1

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

  • 避免大量击键,软件程序的效率有时是通过编写特定功能所需的击键次数来衡量的。
  • 易于阅读和维护。
  • 节省时间的方法。

让我们在这里看看它如何避免大量击键:

在 C# 3.0 之前,我们是这样进行初始化的:

Employee emp = new Employee();
emp.Name = "Kumar";
emp.Department = "IT";
emp.Id = 101;
emp.Salary = 80000;

现在在 C# 3.0 之后,我们将在一行中初始化如下:

Employee emp = new Employee { Name = "Kumar", Department = "IT", Id = 101, Salary = 80000 };
于 2017-05-16T14:55:32.017 回答
0

我认为它提高了可读性。

作为旁注,在显示的链接中给出的示例中,我有时更喜欢为属性(名字和姓氏)使用私有设置器,但这取决于您的设计。

于 2012-10-11T14:56:31.287 回答