【发布时间】:2020-05-06 11:00:40
【问题描述】:
根据微软Docs:
本地函数有两种常见用例:公共迭代器方法和公共异步方法。这两种方法生成的代码报告错误的时间都比程序员预期的要晚。 ... 该技术可以与异步方法一起使用,以确保由参数验证产生的异常在异步工作开始之前抛出:
public Task<string> PerformLongRunningWork(string address, int index, string name)
{
if (string.IsNullOrWhiteSpace(address))
throw new ArgumentException(message: "An address is required", paramName: nameof(address));
if (index < 0)
throw new ArgumentOutOfRangeException(paramName: nameof(index), message: "The index must be non-negative");
if (string.IsNullOrWhiteSpace(name))
throw new ArgumentException(message: "You must supply a name", paramName: nameof(name));
return longRunningWorkImplementation();
async Task<string> longRunningWorkImplementation()
{
var interimResult = await FirstWork(address);
var secondResult = await SecondStep(index, name);
return $"The results are {interimResult} and {secondResult}. Enjoy.";
}
}
我不太明白这个例子。如果我们只是摆脱本地函数并将其内容提取到外部范围并在验证后立即放置,我们会不会得到相同的结果?在这种情况下,本地函数实际上给出了什么?
如果它实际上没有任何改进,你能想出一个更好的例子吗?
【问题讨论】:
-
它使您能够在运行
async操作之前验证数据并抛出异常,否则您只能在等待操作时观察到异常 -
也就是说,我个人认为这个特定用例的好处是可疑的。
ArgmentExceptionand friends should never be caught,所以它们被扔到哪里并不重要。
标签: c# .net async-await c#-7.0