Func <tresp>和Func <tresp的最佳实践,t =“”>

时间:2018-12-09 10:23:57

标签: c# delegates abstraction func

让我们假设我有两个功能,例如:

public T Foo<T>(Func<T> func){
    return func();
}

public TResult Foo<T, TResult>(Func<T, TResult> func, T param){
    return func(param);
}

我要执行以下代码:

someObj.someMethod(someParam);

哪种方法更可取,有什么区别?

var foo = Foo(() => someObj.someMethod(someParam));

var foo = Foo(someObj.someMethod, someParam);

2 个答案:

答案 0 :(得分:1)

第一种方法似乎更可取。

Foo(() => someObj.someMethod(someParam));

someParam与someMethod的关系比Foo多。

答案 1 :(得分:1)

由于没有上下文可以解释为什么您要使用另一个,所以我将介绍差异。

从闭包的角度来看,它的行为将相同(除非第二种方法执行转换或捕获传递的值)。无法捕获变量,因此使用此值执行方法(假设它是可变的)可能会产生不同的结果。另一个不同之处是,您创建另一个方法与仅传递现有方法引用无关。

通常,如果希望以某种方式使用传递的值,则倾向于使用第二种方法。即您有一个try / catch包装器,因此您希望在失败的情况下打印出值。否则,只用第一个。