【问题标题】:Passing default value in constructor在构造函数中传递默认值
【发布时间】:2014-11-03 21:24:02
【问题描述】:

我有一个类Executive,下面是该类的代码。

public class Executive
{
    public Executive(int ID=0)
    {
        //constructor 1
        this.BaseSalary = 3000;
        Console.Write("DONE");
    }

    public Executive()
    {
        //constructor 2
        Console.Write("done");
    }
}

我主要执行以下操作:

Executive exec = new Executive()

它总是调用constructor2。为什么不调用Constructor1(ID有默认值)?

【问题讨论】:

  • 这就是方法重载解析的工作原理。根据解析规则,无参数构造函数比需要默认值的构造函数“更好”。
  • 在你的场景中你会如何调用构造函数#2?

标签: c# constructor overloading


【解决方案1】:

这就是确定最佳调用方法的方式。执行重载解析时,没有指定值的可选参数将从参数列表中删除:

7.5.3.2 更好的函数成员

为了确定更好的函数成员,构造了一个精简的参数列表A,仅包含参数表达式本身,按照它们在原始参数列表中出现的顺序。每个候选函数成员的参数列表按以下方式构造:

• 如果函数成员仅适用于扩展形式,则使用扩展形式。

没有对应参数的可选参数从参数列表中删除

• 对参数进行重新排序,以便它们出现在参数列表中与相应参数相同的位置。

在同一段落的后面:

如果参数类型序列{P1, P2, …, PN}{Q1, Q2, …, QN} 是等价的(即每个Pi 具有到相应Qi 的身份转换),则应用以下平局规则,以确定更好的函数成员。

• 如果MP 是非泛型方法,MQ 是泛型方法,则MP 优于MQ

• 否则,如果MP 以其正常形式适用且MQ 具有参数数组且仅适用于其扩展形式,则MP 优于MQ

• 否则,如果MP 具有比MQ 更多的声明参数,则MP 优于MQ。如果这两种方法都有 params 数组并且仅适用于它们的扩展形式,则会发生这种情况。

否则,如果 MP 的所有参数都有对应的参数,而默认参数需要替换 MQ 中的至少一个可选参数,则 MP 优于 MQ

这意味着如果你有两种方法都有适用的参数,但一种需要使用可选参数值而另一种不需要,那么没有可选值的方法更好。

【讨论】:

    【解决方案2】:

    正如 MarcinJuraszek 所指出的,这就是确定应该调用哪个构造函数的方式。当您调用无参数构造函数时,会确定那个是最合适的。

    解决您的问题的方法是从另一个构造函数中显式调用:

     public class Executive
     {
        public Executive(int ID)
        {
            //constructor 1
            this.BaseSalary = 3000;
            Console.Write("DONE");
        }
    
        public Executive():this(0)
        {
            //constructor 2
            Console.Write("done");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-05-09
      • 2021-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-23
      • 1970-01-01
      相关资源
      最近更新 更多