在构造函数中传递默认值

本文关键字:默认值 构造函数 | 更新日期: 2023-09-27 18:29:00

我有一个类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()

它总是调用Constructor 2。
为什么它不调用构造函数1(因为Id有一个默认值)?

在构造函数中传递默认值

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

7.5.3.2更好的功能成员

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

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

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

•对参数进行重新排序,使其与参数列表中相应的参数出现在同一位置。

同样在同一段后面:

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

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

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

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

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

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

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");
    }
}