如何设置操作的默认参数值

本文关键字:默认 参数 操作 何设置 设置 | 更新日期: 2023-09-27 18:33:21

当参数为字典类型时,如何为操作设置默认参数值?

例如:

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 是值类型,例如 enumstruct ;

  • 形式
  • default(ValType) 的表达式,其中 ValType 是值类型。

MSDN

不能将字典设置为 NULL 以外的任何内容。如果您尝试,例如:

public void Test(Dictionary<int, bool> dic = new Dictionary<string, string> { { "1", "true" }})或其他什么,那么你会看到这个错误:

"dic"的默认参数值必须是编译时常量。

因此,在这种情况下,NULL是您唯一的选择。但是,这样做毫无意义

public void Test(Dictionary<int, bool> dic = null)

在最坏的情况下,如果调用方尚未实例化新实例,则无论如何都会NULL传入的dic,因此无论如何添加NULL默认值都没有优势。

假设

您希望在方法签名中提供非null默认值,则无法使用此类型执行此操作。但是,您有两种替代解决方案这立即浮现在脑海中。

1,使用带有默认值的可选参数,这必须为Dictionary(以及除string我相信之外的所有其他引用类型)null,并且您将需要方法内部的逻辑来处理它:

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)
{
}

可选参数无论如何都会编译成重载方法,因此它们几乎在语义上相同,它只是您希望在何处表达默认值的首选项。