在构造函数中传递默认值
本文关键字:默认值 构造函数 | 更新日期: 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
中的至少一个可选参数,则MP
比MQ
更好
这意味着,如果有两个方法都有适用的参数,但其中一个需要使用可选的参数值,而另一个没有,那么没有可选值的方法更好。
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");
}
}