有条件地使用参数默认值,不作任何反映

时间:2019-12-18 17:10:26

标签: c#

出于好奇,我想知道是否可以有条件地使用默认参数值来调用函数。用一个例子更容易解释:

    private void Function1(string param1)
    {
        // OPTION 1
        // I can do it this way: if param is null or empty, use the Function2 default value
        if (string.IsNullOrEmpty(param1))
        {
            Function2();
        }
        else
        {
            Function2(param1);
        }

        // OPTION 2
        // Can I replace above code with this pseudo code?
        // If param is empty, use Function2 default parameter value? In this case, default_param_value = A
        Function2(string.IsNullOrEmpty(param1) ? default_param_value : param1);
    }

    private void Function2(string param2 = "A")
    {
        MessageBox.Show(param2);
    }

在不使用反射的情况下,我可以使用定义的值或默认参数值调用Function2,而不必担心Function2标头中定义了什么(使用类似此伪关键字default_param_value的东西)吗?有没有办法实现上述选项2?

非常感谢。

1 个答案:

答案 0 :(得分:-1)

使用动作委托进行更新:

private void Function2(string param2 = "A")
{
    // no-op
    Console.WriteLine($"Param2 = {param2}");
}

private void Function1(string param1)
{
    var actionsDictionary = new Dictionary<bool, Action<string>>
    {
        { false, this.Function2 },
        { true, (p) => { this.Function2(); } }
    };

    actionsDictionary[string.IsNullOrWhiteSpace(param1)](param1);
}

[TestMethod]
public void TestNow()
{
    Console.WriteLine("Begin invoking Function1 with different params");
    Function1(null);
    Function1(String.Empty);
    Function1("        ");
    Function1("Some Value");
    Console.WriteLine("End invoking Function1 with different params");
}

这是测试方法的输出:

  

测试名称:TestNow

     

测试结果:通过

     

结果标准输出:

     

以不同的参数开始调用Function1

     

Param2 = A

     

Param2 = A

     

Param2 = A

     

Param2 =一些值

     

以不同的参数结束调用Function1

您可以抓取以下答案。

仅当未提供相应数据类型的默认值时才使用默认值。在您的情况下,Funciton2采用字符串数据类型,其默认值为null。因此,仅当Function2收到null时才使用“ A”。

  • 如果您确定param1永远不会有空字符串(例如“”或“”),则可以简单地调用
Function2(param1)
  • 如果param1可能包含空字符串或空格,则在这种情况下, Function2的默认值将不被采用。所以,
if (string.IsNullOrWhiteSpace(param1))
{
    param1 = null;
}
Function2(param1)