在C#中,我有以下函数定义:
public static TResult SomeParentFunctionName<TSource, TResult>(TSource SomeValue,Func<TSource, TResult> ChildFunction1, Func<TSource, TResult> ChildFunction2)
此功能需要SomeValue
,然后调用ChildFunction1
和ChildFunction2
根据我的业务规则,我始终需要运行ChildFunction1
,但只有有时需要运行ChildFunction2
。
我可以将ChildFunction2
作为可选参数吗?我该怎么做呢?我怎么知道它是否已被传入。
1)我可以创建两个SomeParentFunctionName
函数,一个使用ChildFunction2
,另一个不使用。{/ p>
2)我可以传递一个空白的功能,但它不会做任何事情 - 但这不是一个好习惯。
注意:对于那些想开始对这个问题大吼大叫的人,如果你不能帮忙,就不要这样做。
答案 0 :(得分:8)
当然,只需将其设置为null:
public static TResult SomeParentFunctionName<TSource, TResult>(
TSource SomeValue,
Func<TSource, TResult> ChildFunction1,
Func<TSource, TResult> ChildFunction2 = null)
{
...
if (ChildFunction2 != null)
ChildFunction2();
}
如果你想传递ChildFunction2
的函数,请继续执行。如果你不想传递任何东西,只需在调用函数时省略它。
这实际上就是你所说的 - optional argument
答案 1 :(得分:2)
有第三种选择。使用params
关键字指示该函数采用可变数量的参数。但是,您需要处理没有传递Func<TSource, TResult>
个对象的情况。
如果您总是需要1个或2个Func<TSource, TResult>
个对象,那么按照您在选项1中的建议重载该功能是处理这种情况的最常用方法。
答案 2 :(得分:1)
我可以将ChildFunction2作为可选参数吗?
当然,只需提供默认值null
:
public static TResult SomeParentFunctionName<TSource, TResult>(
TSource SomeValue,
Func<TSource, TResult> ChildFunction1,
Func<TSource, TResult> ChildFunction2 = null)
然后只检查null
:
{
TResult res = ChildFunction1(source);
if(ChildFunction2 != null)
TResult res2 = ChildFunction1(source2);
}