在C#构造函数中初始化时哪个更好:初始化列表或赋值?

min*_*nda 28 c# constructor initialization variable-assignment

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

只要我保持一致,任何人都可以给出任何理由而不喜欢一个吗?

class A
{
    String _filename;

    A(String filename) : _filename(filename)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)


class B
{
    String _filename;

    B(String filename)
    {
        _filename = filename;
    }
}
Run Code Online (Sandbox Code Playgroud)

Jar*_*Par 81

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

所以我会选择第二个.

  • 谢谢你,来自C++我想知道语法A(成员初始化列表)是否也适用于C#. (13认同)

Jer*_*ell 17

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

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

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


MPe*_*ier 6

C# 7.0 开始,有一种方法可以使用表达式体来简化它:

A(String filename) => _filename = filename;
Run Code Online (Sandbox Code Playgroud)

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

A(String filename, String extension) => (_filename, _extension) = (filename, extension);
Run Code Online (Sandbox Code Playgroud)