c#构造函数默认参数的正确方法

cat*_*lin 2 c# parameters constructor default

所以我需要了解哪种方式是正确/最好的方式?

第一种方式:

class Customer
{
    string firstName;
    string lastName;

    public Customer(string firstName="non", string lastName="applicable")
    {
        this.firstName = firstName;
        this.lastName = lastName;
    }
}
Run Code Online (Sandbox Code Playgroud)

第二种方式:

class Customer
{
    string firstName;
    string lastName;

    public Customer()
    : this("non","applicable")
    { }

    public Customer(string firstName, string lastName)
    {
        this.firstName = firstName;
        this.lastName = lastName;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我正在创建一个方法 printFullName(),它在两种情况下都适用。那么选择哪一个呢?第一个对我来说似乎更容易。

h-r*_*rai 7

从语义上来说,两种方式都是正确的。两者之间的一些区别是

第一种方式: 调用构造函数:

  1. new Customer(firstName="first");
  2. new Customer(lastName="last");
  3. new Customer("first", "last");
  4. new Customer();

第二种方式: 调用构造函数:

  1. new Customer("first", "last");
  2. new Customer();

因此,第一种方法将为您提供更多调用构造函数的灵活性。


Sco*_*nen 6

第二种方法更好,因为如果“non”和“applicable”不提供输入,您似乎打算使用它们作为名字和姓氏。

如果您只有一个带有可选参数的构造函数,那么有人可以提供一个名字,并将姓氏设为“适用”,例如“Bob 适用”。

这是一个微小的区别,因为 a) 它以任何一种方式工作,并且 b) 消费者可以知道默认参数是什么。但是第二个选项似乎更符合您的明显意图。

要特别特别,我会重新考虑这些默认值。有人应该能够创建一个没有名字的客户吗?如果是这样,那么名称可能应该为空。也许CustomerName应该是一个单独的类,并且Customer有一个Name类型CustomerName.的属性我之所以对这个问题不屑一顾,是因为你想知道你是否有名字。一旦你提供了一个更难确定的假名。您可以向名为“不适用”的客户发送数百封信函。