当参数是字典类型时,如何为操作设置默认参数值?
例如:
public void Test(Dictionary<int, bool> dic) {
...
}
当参数是字典类型时,如何为操作设置默认参数值?
例如:
public void Test(Dictionary<int, bool> dic) {
...
}
您不能以您想要的方式给它一个默认值,因为它必须是一个编译时常量值,但您可以执行以下操作:
private static bool Test(Dictionary<string, string> par = null)
{
if(par == null) par = GetMyDefaultValue();
// Custom logic here
return false;
}
您可以null
像在其他答案中一样使用特殊情况,但是如果您仍然希望能够调用Test(null)
并且具有与调用不同的行为Test()
,那么您必须链接重载:
public void Test(Dictionary<int, bool> dic) {
//optional, stops people calling Test(null) where you want them to call Test():
if(dic == null) throw new ArgumentNullException("dic");
...
}
public void Test() {
var defaultDic = new Dictionary<int, bool>();
Test(defaultDic);
}
您只能用作引用类型null
的默认参数值。
默认值必须是以下表达式类型之一:
一个常量表达式;
形式的表达式
new ValType()
,其中ValType
是值类型,例如 anenum
或 astruct
;形式的表达式
default(ValType)
,其中ValType
是值类型。
假设您想null
在方法签名中提供非默认值,您无法使用此类型执行此操作。但是,您会立即想到两个替代解决方案。
1,使用带有默认值的可选参数,这必须null
用于 a Dictionary
(以及除我相信之外的所有其他引用类型string
),并且您需要方法内部的逻辑来处理它:
public void Test(Dictionary<int, bool> dictionary = null)
{
// Provide a default if null.
if (dictionary == null)
dictionary = new Dictionary<int, bool>();
}
或者,我会这样做,只需使用“老式”方法重载。这使您可以区分不提供论点的人和提供null
论点的人:
public void Test()
{
// Provide your default value here.
Test(new Dictionary<int, bool>();
}
public void Test(Dictionary<int, bool> dictionary)
{
}
可选参数无论如何都会编译成重载方法,因此它们在语义上几乎相同,只是您希望在哪里表达默认值的偏好。
您不能将字典设置为除 NULL 以外的任何值。如果你尝试,例如:
public void Test(Dictionary<int, bool> dic = new Dictionary<string, string> { { "1", "true" }})
或其他什么,然后你会看到这个错误:
'dic' 的默认参数值必须是编译时常量。
所以在那种情况下,NULL
是你唯一的选择。然而,这样做是没有意义的
public void Test(Dictionary<int, bool> dic = null)
在最坏的情况下,如果调用者没有实例化一个新实例,那么无论如何dic
都会传入,所以无论如何添加默认值NULL
都没有优势。NULL