我正在开发一个API,我正在寻找一个好的,可理解的命名约定。
考虑具有相同功能的这些不同类型的重载:
public async Task<TResult> DoAsync<T,TResult>(Func<T,TResult> func)
{
var t = await ProcessAsync();
return func(t);
}
public async Task<TResult> DoAsyncAlsoAwaitDelegateAsync<T,TResult>(Func<T,Task<TResult>> funcAsync);
{
var t = await ProcessAsync();
return await funcAsync(t);
}
请注意,我无法进行重载DoAsync<T,TResult>(Func<T,Task<TResult>> func)
,因为这会导致调用模糊。
用户可以通过在调用时指定参数名来解决模糊调用,但如果可能的话,我宁愿不会产生不必要的混淆。
DoAlsoAwaitDelegateAsync
是一个非常笨拙的名字,所以我在这里寻找替代的命名约定。
答案 0 :(得分:2)
如果你必须接受一个委托(而不是只是将计算值返回给调用者并让他们自己执行函数/任务组合)我只会接受一个版本Func<T,Task<TResult>>
。
将它留给调用者,无论他们是否有自己的异步函数,或者只是给你一个完全同步执行的函数,然后返回Task.FromResult()
。而不是(当前)编写函数的两个版本,只是 it 知道委托可能利用某些异步。