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

时间:2013-10-01 07:55:56

标签: c# methods parameters default-value

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

例如:

public void Test(Dictionary<int, bool> dic) {
    ...
}

5 个答案:

答案 0 :(得分:4)

你不能以你想要的方式给它一个默认值,因为它必须是一个编译时常量值,但你可以这样做:

private static bool Test(Dictionary<string, string> par = null)
    {
        if(par == null) par = GetMyDefaultValue();
        // Custom logic here
        return false;
    }

答案 1 :(得分:4)

您可以使用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);
}

答案 2 :(得分:1)

您只能将null用作参考类型的默认参数值。

  

默认值必须是以下类型的表达式之一:

     
      
  • 一个恒定的表达;

  •   
  • 表单new ValType(),其中ValType是值类型,例如enumstruct;

  •   
  • 表单default(ValType),其中ValType是值类型。

  •   

MSDN

答案 3 :(得分:0)

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

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

public void Test(Dictionary<int, bool> dictionary = null)
{
    // Provide a default if null.
    if (dictionary == null)
        dictionary = new Dictionary<int, bool>();
}

或者,以及我的方式,只需使用&#34;老式的&#34;方法重载。这使您可以区分不提供参数的人和提供null参数的人:

public void Test()
{ 
    // Provide your default value here.
    Test(new Dictionary<int, bool>();
}

public void Test(Dictionary<int, bool> dictionary)
{

}

可选参数无论如何编译成重载方法,所以它们差不多 在语义上相同,它只是偏好您希望表达默认值的位置。

答案 4 :(得分:0)

您无法将字典设置为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默认值。