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

C# 使用对象初始值设定项有什么好处吗?,c#,.net,memory-management,C#,.net,Memory Management,使用C#对象初始值设定项有什么好处吗 在C++中没有引用,所有东西都封装在对象中,所以在创建对象之后使用它们而不是初始化成员是有意义的。 它们在C#中的用途是什么 好处在于使用匿名对象、linq查询,有时仅仅为了传递参数而不需要重载构造函数一个经常被忽略的好处是原子性。如果在对象上使用,则此选项非常有用。对象初始值设定项在初始化您告诉它的所有成员后返回新对象。根据MSDN文章中的示例: StudentName student = new StudentName { FirstName =

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

<>在C++中没有引用,所有东西都封装在对象中,所以在创建对象之后使用它们而不是初始化成员是有意义的。 它们在C#中的用途是什么


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

一个经常被忽略的好处是原子性。如果在对象上使用,则此选项非常有用。对象初始值设定项在初始化您告诉它的所有成员后返回新对象。根据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中创建投影或连接多个键)。

我认为它提高了可读性


作为旁注,在所示链接中给出的示例中,我有时更喜欢为属性(FirstName和LastName)使用私有setter,但这取决于您的设计。

不使用对象初始值设定项有一个潜在的原因:如果在初始化过程中出现异常,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";
    }

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

保存一些击键并将代码放到单个可执行语句中(对于内联linq调用之类的东西)是一种语法上的糖分。该样式也被借用用于匿名类型创建:
new{FirstName=“Adam”,Age=27}请不要在问题标题中包含关于所用语言的信息,除非没有它就没有意义。标签用于此目的。u编辑18个月大question@SandeepSinghRawat编辑旧帖子没有错,只要有充分的理由这样做。+1它还允许隐式键入此类参数,而不必编写新的MyType(){…}您还可以通过在构造函数中使用命名参数和可选参数来避免不必要的构造函数重载:您的答案有点混乱。看起来您建议使用私有setter和对象初始化器语法来创建类似于只读属性的功能。如果您将setter设置为私有,则它们不能与对象初始值设定项语法一起使用,除非您在已经可以访问这些私有setter的位置使用它。我同意。我应该用更好的措辞。为了回答这个问题,我只想说我认为它提高了可读性。我写的其余部分有点离题。我编辑了文本试图反映这一点。如果在
StudentName
的构造函数中初始化了
FirstName
LastName
ID
,原子性不会被保留吗?是的,会。上述关于原子性的声明适用于需要在构造函数外部初始化对象属性的情况。例如,您无法更改构造函数代码,或者您的对象有大量可选属性,您需要在不创建几十个重载构造函数的情况下设置这些属性。我在这篇文章的结尾就是为了检查是否有人声称有相同的情况。在过去的几周里,我的团队一直在讨论这个问题。作为一名开发人员,我确实喜欢它提供的语法sugar(上面提到的其他好处与我的上下文无关),但我可以接受这一点作为不使用它的理由(在我这样的情况下,您在使用它时不会从任何其他方面受益)。我们还发现,在许多情况下,由于涉及的属性和外部供应商模型的数量,对象初始值设定项语法使得调试复杂模型几乎不可能。