C# 构造函数调用构造函数是更好的方法吗?

C# 构造函数调用构造函数是更好的方法吗?,c#,C#,我已经提交了一段代码供审查,我得到的反馈是,最好让构造函数调用构造函数,而不是像下面这样重复set语句: public GenericFileReader(string fileName) { _filename = fileName; _encoding = Encoding.GetEncoding("windows-1252"); } public GenericFileReader(string fileName, Enco

我已经提交了一段代码供审查,我得到的反馈是,最好让构造函数调用构造函数,而不是像下面这样重复set语句:

    public GenericFileReader(string fileName)
    {
        _filename = fileName;
        _encoding = Encoding.GetEncoding("windows-1252");
    }

    public GenericFileReader(string fileName, Encoding encoding)
    {
        _filename = fileName;
        _encoding = encoding;
    }
我知道有一种方法可以让构造函数调用构造函数,如下所示:

    public GenericFileReader(string fileName) : 
        this(fileName, Encoding.GetEncoding("windows-1252"))
    {
    }
    public GenericFileReader(string fileName, Encoding encoding)
    {
        _filename = fileName;
        _encoding = encoding;
    }

第二种方法在减少代码行数方面似乎很好。我仍然不相信第二种方法比前一种更好。因为,两次调用构造函数似乎比设置编码和文件名的操作成本更高。请告诉我哪种方法更好?

就我个人而言,我更喜欢有一个构造函数,让它调用下面这样的子函数来处理更复杂的内容

编辑:关于为什么不重载构造函数,请参阅Zohar对此回复的评论。

你最好的例子(IMO)

我之所以选择这个函数,是因为当我不使用中心函数供构造函数使用时,我更喜欢它的可读性。但我通常有我的中心函数,如下面的示例所示

public GenericFileReader(string filename) 
{
    _filename = filename;
    _encoding = Encoding.GetEncoding("windows-1252");
}

public GenericFileReader(string filename, Encoding encoding)
{
    _filename = filename;
    _encoding = encoding;
}
用于更复杂的构造函数,但使用您的示例

public GenericFileReader(string filename)
{
    init(ref filename);
}

public GenericFileReader(string filename, Encoding encoding)
{
    init(ref filename, encoding);
}

private init(ref string filename, Encoding encoding = null)
{
   _filename = filename;
   _encoding = encoding ?? Encoding.GetEncoding("windows-1252");
}

在最底层的情况下,您可能会有多个重载构造函数,所有构造函数都以不同的方式调用init函数。

许多好的问题都会根据专家经验产生一定程度的意见,但这个问题的答案往往几乎完全基于意见,而不是事实、参考,或者特定的专业知识。所有与我共事的MVP都会说重载构造函数更好。只有一个地方有代码——它是OOP的可重用和封装部分。第一种方法更像是程序编程。@KobyDouek不,我不认为这个问题没有合乎逻辑的答案。@Rajan365-这是DRY的定义吗?你会发现大多数程序员对这两种方法都没问题,但是有时你会遇到需要一致性、亲吻、干燥等原则的团队,这就是为什么他们说要用第二种方法。对于公共类的公共表面,我建议不要使用可选参数。有什么原因吗?第二个函数可以被修改为重载,而不存在选项,这就是为什么我包含它。我喜欢你的方法,但给出的第一个示例不起作用,因为我们无法在编译时将参数编码初始化为默认值,因为编译器会抛出警告。我们可以把它改为null!由于可选参数的工作方式-如果其他某个类正在使用您的构造函数而未指定编码参数,则会将其默认值注入该其他类的已编译程序集。如果它位于不同的程序集中,那么您的类中,您要对编码的默认值进行的任何更改都必须重新编译这两个程序集。这就是我总是喜欢重载而不是可选参数的主要原因。啊,当然!我没有想到这一点,我甚至在几周前在Xamarin遇到了这个问题,并且经历了修复它的过程,甚至没有想到这一点,我将相应地编辑我的建议。为信息佐哈干杯!