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

时间:2010-03-12 19:19:15

标签: c# constructor initialization variable-assignment

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

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

class A
{
    String _filename;

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


class B
{
    String _filename;

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

4 个答案:

答案 0 :(得分:78)

第一个在C#中不合法。构造函数中冒号后面只能出现的两个项目是basethis

所以我会选择第二个。

答案 1 :(得分:17)

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

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

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

答案 2 :(得分:2)

C# 7.0开始,有一种方法可以通过表达式主体来简化此过程:

A(String filename) => _filename = filename;

(尽管在两个字段中看起来更好):

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

答案 3 :(得分:1)

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