Func<TResp> 和 Func<TResp, T> 的最佳实践
Best pratices for Func<TResp> and Func<TResp, T>
让我们假设我有两个函数:
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);
第一种方法似乎更可取。
Foo(() => someObj.someMethod(someParam));
因为 someParam 与 someMethod 的关系多于 Foo。
由于没有关于为什么要使用一个而不是另一个的上下文,我将介绍差异。
从闭包的角度来看,它将以相同的方式运行(除非第二种方法执行转换或捕获传递的值)。变量未被捕获,因此使用此值(假设它是可变的)执行方法可能会产生不同的结果。另一个区别是您创建另一个方法与仅传递现有方法引用。
一般来说,如果您希望以某种方式使用传递的值,您更愿意使用第二种方法。 IE。你有一个 try/catch 包装器,所以你想在失败的情况下打印值。否则就用第一个。
让我们假设我有两个函数:
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);
第一种方法似乎更可取。
Foo(() => someObj.someMethod(someParam));
因为 someParam 与 someMethod 的关系多于 Foo。
由于没有关于为什么要使用一个而不是另一个的上下文,我将介绍差异。
从闭包的角度来看,它将以相同的方式运行(除非第二种方法执行转换或捕获传递的值)。变量未被捕获,因此使用此值(假设它是可变的)执行方法可能会产生不同的结果。另一个区别是您创建另一个方法与仅传递现有方法引用。
一般来说,如果您希望以某种方式使用传递的值,您更愿意使用第二种方法。 IE。你有一个 try/catch 包装器,所以你想在失败的情况下打印值。否则就用第一个。