【问题标题】:When initializing in C# constructors what's better: initializer lists or assignment?在 C# 构造函数中初始化时,更好的是:初始化列表还是赋值?
【发布时间】:2011-01-26 23:16:40
【问题描述】:

A 类使用初始化列表将成员设置为参数值,而 B 类使用构造函数体内的赋值。

只要我始终如一,谁能给出任何理由偏爱其中一个?

class A
{
    String _filename;

    A(String filename) : _filename(filename)
    {
    }
}


class B
{
    String _filename;

    B(String filename)
    {
        _filename = filename;
    }
}

【问题讨论】:

    标签: c# constructor initialization variable-assignment


    【解决方案1】:

    截至C# 7.0,有一种方法可以通过表达式主体来简化这一点:

    A(String filename) => _filename = filename;
    

    (虽然有两个字段看起来更好):

    A(String filename, String extension) => (_filename, _extension) = (filename, extension);
    

    【讨论】:

      【解决方案2】:

      C# 有一个名为Object Initializer 的功能。您可以提供编译器将用于初始化指定成员的值,并调用默认构造函数。为此,您需要有一个公共的默认构造函数。

      【讨论】:

        【解决方案3】:

        您的意思是 C++ 而不是 C#?

        对于 C++,初始化列表比赋值更好,原因如下:

        • 对于 POD 类型(int、float 等),当您为数据提供初始化程序时,优化器通常可以在后台执行更高效的 memcpy。
        • 对于非 POD 类型(对象),您只需执行一次构造即可获得效率。通过构造函数中的赋值,编译器必须首先构造您的对象,然后在单独的步骤中对其进行赋值(这也适用于 POD 类型)。

        【讨论】:

          【解决方案4】:

          第一个在 C# 中是不合法的。在构造函数中,冒号后面唯一可以出现的两项是basethis

          所以我会选择第二个。

          【讨论】:

          • 谢谢,来自 C++ 我想知道语法 A(成员初始化列表)是否也适用于 C#。
          猜你喜欢
          • 2021-12-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-23
          • 1970-01-01
          • 2011-08-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多