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

Posted

技术标签:

【中文标题】使用对象初始化器有啥好处吗?【英文标题】:Is there any benefit of using an Object Initializer?使用对象初始化器有什么好处吗? 【发布时间】:2012-10-02 06:48:20 【问题描述】:

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

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

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

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

【问题讨论】:

它是一种语法糖,可以节省一些击键并将代码放入单个可执行语句(用于内联 linq 调用之类的东西)。该样式也借用于匿名类型创建:new FirstName = "Adam", Age = 27 ; 请不要在问题标题中包含有关所用语言的信息,除非没有它就没有意义。标记用于此目的。 你编辑了 18 个月大的问题 @SandeepSinghRawat 编辑旧帖子没有任何问题,只要有充分的理由这样做。 【参考方案1】:

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

【讨论】:

+1 它还允许对此类参数进行隐式键入,而不必到处写 new MyType() ....。 您还可以通过在构造函数中使用命名参数和可选参数来避免不必要的构造函数重载:msdn.microsoft.com/en-us/library/dd264739.aspx【参考方案2】:

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

【讨论】:

如果FirstNameLastNameIDStudentName的构造函数中被初始化,原子性会不会被保留? 是的,它会的。上面关于原子性的声明适用于当您需要在构造函数之外初始化对象的属性时。这方面的一些示例是您无法更改构造函数代码的情况,或者您的对象具有大量您想要设置的可选属性,而无需创建数十个重载的构造函数。【参考方案3】:

我认为它提高了可读性。

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

【讨论】:

你的回答有点混乱。看起来您建议使用私有设置器和对象初始化器语法来创建类似于只读属性的功能。如果您将设置器设为私有,则它们不能与对象初始化器语法一起使用,除非您在已经可以访问这些私有设置器的位置使用它。 我同意。我应该措辞更好。要回答 OP,我真的只是说我认为它提高了可读性。我写的其余部分有点离题。我已经编辑了文本以试图反映这一点。【参考方案4】:

使用对象初始化器有一个潜在的原因:如果初始化期间出现异常,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";
    

【讨论】:

我在这篇文章中结束了正是为了检查是否有人声称相同。在过去的几周里,我的团队一直在讨论这个问题。作为开发人员,我确实喜欢它提供的语法糖(上面指出的其他好处与我的上下文无关) - 但我可以接受这是一个足够强大的理由而不使用它(在我这样的情况下你没有受益从其他任何使用它)。 我们还发现了许多情况,由于涉及的属性和外部供应商模型的数量,对象初始化器语法使得调试复杂模型几乎不可能。【参考方案5】:

对象初始化有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 ;

【讨论】:

以上是关于使用对象初始化器有啥好处吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用对象检测api的默认配置时,不同尺寸的图像缩放器有啥影响

python中的迭代器有啥用

使用嵌套迭代器有啥意义吗?

“创建对象”和“初始化”对象有啥区别? [复制]

闭包存储属性初始化有啥好处?

像这样初始化 jQuery 有啥好处?