出于好奇,我想知道是否可以有条件地使用默认参数值来调用函数。用一个例子更容易解释:
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?
非常感谢。
答案 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”。
Function2(param1)
if (string.IsNullOrWhiteSpace(param1)) { param1 = null; } Function2(param1)