c#可选的Func参数

时间:2014-07-24 22:22:10

标签: c# parameters anonymous-function func

在C#中,我有以下函数定义:

public static TResult SomeParentFunctionName<TSource, TResult>(TSource SomeValue,Func<TSource, TResult> ChildFunction1, Func<TSource, TResult> ChildFunction2)

此功能需要SomeValue,然后调用ChildFunction1ChildFunction2

根据我的业务规则,我始终需要运行ChildFunction1,但只有有时需要运行ChildFunction2

我可以将ChildFunction2作为可选参数吗?我该怎么做呢?我怎么知道它是否已被传入。

我考虑的选项:

1)我可以创建两个SomeParentFunctionName函数,一个使用ChildFunction2,另一个不使用。{/ p>

2)我可以传递一个空白的功能,但它不会做任何事情 - 但这不是一个好习惯。


注意:对于那些想开始对这个问题大吼大叫的人,如果你不能帮忙,就不要这样做。

3 个答案:

答案 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);

}