【问题标题】:c# constructor default parameters correct wayc#构造函数默认参数正确方法
【发布时间】:2018-01-11 11:16:15
【问题描述】:

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

第一种方式:

class Customer
{
    string firstName;
    string lastName;

    public Customer(string firstName="non", string lastName="applicable")
    {
        this.firstName = firstName;
        this.lastName = lastName;
    }
}

第二种方式:

class Customer
{
    string firstName;
    string lastName;

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

    public Customer(string firstName, string lastName)
    {
        this.firstName = firstName;
        this.lastName = lastName;
    }
}

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

【问题讨论】:

  • many“重载vs可选参数”的问题,但是你觉得无参构造函数可能更特别一点?
  • 我觉得差别不大,所以选择对你来说更清晰的那个。这个问题似乎属于“主要基于意见”的类别。
  • 考虑到序列化,我认为你may want 有无参数构造函数。
  • @Pikoh 有一个区别——如果你用new Customer("Jim", null) 调用两者会发生什么?
  • @ZippyZippedUp 是的,你是对的。在 Scott Hannen 回答之后,我意识到这将是一个问题。

标签: c# parameters constructor default


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    就语义而言,两种方式都是正确的。两者之间的一些区别是

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

    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();

    因此,第一种方式在调用构造函数方面给您提供了更大的灵活性。

    【讨论】:

      猜你喜欢
      • 2014-07-09
      • 1970-01-01
      • 2012-02-26
      • 2016-03-01
      • 1970-01-01
      • 2012-06-30
      • 2014-05-15
      • 1970-01-01
      相关资源
      最近更新 更多