可选函数参数

8
在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,一个没有。

  2. 我可以传入一个什么也不做的空白函数 - 但这不是好的实践。


1
什么决定了你需要运行 ChildFunction2?你知道在调用 SomeParentFunctionName 之前必须运行它吗?如果是这样,我会说重载可能是最直接的方法。 - Dave Zych
调用SomeParentFunctionName的用户已经知道是否会调用ChildFunction2。是的,这是我的考虑之一。你能想到另一种方法吗? - Simcha Khabinsky
你可以传入 null(我从来不喜欢这种方式),或者使用可选参数并将其设置为 null,这样会更加简洁。 - Dave Zych
这回答解决了你的问题吗?如何在C#中使用可选参数? - Cole Tobin
3个回答

13

没问题,只需要将其设置为 null:

public static TResult SomeParentFunctionName<TSource, TResult>(
    TSource SomeValue,
    Func<TSource, TResult> ChildFunction1, 
    Func<TSource, TResult> ChildFunction2 = null)
{
    ...
    if (ChildFunction2 != null)
        ChildFunction2();
}
如果您想为ChildFunction2传递一个函数,请随意这样做。如果您不想为它传递任何内容,只需在调用该函数时省略即可。
实际上,这正是您所称呼的 - 可选参数

2
有第三种选择。使用“params”关键字指示函数接受可变数量的参数。但是,您需要处理未传递任何“Func<TSource,TResult>”对象的情况。
如果您总是需要1个或2个“Func<TSource,TResult>”对象,则按照选项1中建议的重载函数是处理此情况的最常见方式。

谢谢,这是另一个选择。 - Simcha Khabinsky

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

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接