在C#构造函数中进行初始化,使用初始化器列表好还是赋值好?

32

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

只要保持一致,有人能给出倾向于一种方式的任何理由吗?

class A
{
    String _filename;

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


class B
{
    String _filename;

    B(String filename)
    {
        _filename = filename;
    }
}
4个回答

98

第一种方式在C#中是不合法的。在构造函数中,冒号后面只能出现basethis这两个关键字。

因此我会选择第二种方式。


23
谢谢您的询问。作为一名来自C++的程序员,您想知道在C#中是否也可以使用语法A(成员初始化列表)。 - Andreas Reiff

19

你是不是想说 C++ 而不是 C#?

对于 C++,初始化列表比赋值更好,有几个原因:

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

12

C# 7.0起,可以使用表达式主体来简化此过程:

A(String filename) => _filename = filename;

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

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

1

C#有一个称为Object Initializer的特性。您可以提供值,编译器将使用这些值来初始化指定的成员,并调用默认构造函数。为使其正常工作,您需要拥有一个公共的默认构造函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接