当前位置: 首页 > 知识库问答 >
问题:

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

唐增
2023-03-14

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

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

在C#中使用它们的情况是什么?

如何:使用对象初始值设定项初始化对象(C#编程指南)

共有3个答案

岳奇逸
2023-03-14

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

鄢承运
2023-03-14

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

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

 类似资料:
  • 我对Swift类有一个问题。我有UITableViewController类和UITableViewCell类的swift文件。我的问题是UITableViewCell类和网点。这个类有一个错误Class“HomeCell”没有初始化程序,我不明白这个问题。 感谢您的回复。

  • 本文向大家介绍详解C#中使用对象或集合的初始值设定项初始化的操作,包括了详解C#中使用对象或集合的初始值设定项初始化的操作的使用技巧和注意事项,需要的朋友参考一下 使用对象初始值设定项初始化对象 可以使用对象初始值设定项以声明方式初始化类型对象,而无需显式调用类型的构造函数。 下面的示例演示如何将对象初始值设定项用于命名对象。编译器通过先访问默认实例构造函数然后处理成员初始化处理对象初始值设定项。

  • 我通过解决一些黑客等级问题来学习java。下面的代码是关于学习静态初始值设定项块的。例外情况是thown和Capture,但程序仍在运行,我不确定原因。 输入:-1,2 预期输出:java.lang.例外:宽度和高度必须为正 实际输出:宽度和高度必须为正-2

  • 问题内容: 一个简单的例子: HTML CSS 和之间有什么区别?仅支持浏览器 问题答案: 根据您的链接: 是一个CSS值,如果继承了一个属性,则该属性与“继承”相同;如果不继承一个属性,则其属性为“初始” 这是一个例子: 如果您要覆盖样式表中的某些CSS,但您更希望该值是继承的,而不是设置回浏览器的默认值,那么这种情况就很重要。 例如:

  • 问题内容: 是否有任何特定原因为何未将对指定的初始化程序的支持添加到g ?是C99标准来晚了,而g 却被开发得更早,后来人们却不在乎这个问题的原因,还是在C ++语法中实现指定的初始化程序存在一些固有的困难? 问题答案: 正如我在评论中指出的那样,G ++不支持C99标准指定的初始化程序,但是它支持对C90的GNU扩展,它允许指定的初始化程序。所以这不起作用: 但这确实是: 这似乎是C和C 标准委