我有一个异步方法,它将通过API寻找作业调度服务的作业ID。
如果它没有找到结果,返回空任务还是null更好?
正如我所理解的,当返回集合时,返回空集合比返回null更好,使用对象时,返回null比返回空对象更好;但对于任务,我不确定哪一个是最好的。见所附方法。
谢谢
public virtual Task<int> GetJobRunIdAsync(int jobId)
{
var jobMonRequest = new jobmonRequest(true, true, true, true, true,
true, true, true, true, true, true, true,
true,
true, true, true, DateTime.Today, jobId, null, 0, null, null,
null, null, 0, 0);
var jobMonResponseTask = Client.jobmonAsync(jobMonRequest);
var jobTask = jobMonResponseTask.ContinueWith(task =>
{
if (jobMonResponseTask.Result == null )
{
var empty = new Task<int>(() => 0); // as i understand creating a task with a predefined result will reduce overhead.
return empty.Result; // || is it better to just return null?
}
if (jobMonResponseTask.Result.jobrun.Length > 1)
{
throw new Exception("More than one job found, Wizards are abound.");
}
return jobMonResponseTask.Result.jobrun.Single().id;
});
return jobTask;
}
如果它没有找到结果,返回空任务还是null更好?
这里有几件事需要考虑:
null
因此,从方法返回的
我不确定哪个是最好的任务。
任务只是一个包装器。底层逻辑还是一样的。想想如果这个方法是同步的,它会是什么样子;您的返回类型是
最后,我必须说:
您的方法可以大大简化:
public virtual async Task<int> GetJobRunIdAsync(int jobId)
{
var jobMonRequest = ...;
var jobMonResponse = await Client.jobmonAsync(jobMonRequest);
if (jobMonResponse == null)
return 0;
if (jobMonResponse.jobrun.Length > 1)
throw new Exception("More than one job found, Wizards are abound.");
return jobMonResponse.jobrun.Single().id;
}
或者,如果要返回
public virtual async Task<int?> GetJobRunIdAsync(int jobId)
{
var jobMonRequest = ...;
var jobMonResponse = await Client.jobmonAsync(jobMonRequest);
if (jobMonResponse == null)
return null;
if (jobMonResponse.jobrun.Length > 1)
throw new Exception("More than one job found, Wizards are abound.");
return jobMonResponse.jobrun.Single().id;
}
如果确实要从异步方法返回null,可以使用
例如:
public async Task<FileInfo> GetInfo()
{
return await Task.FromResult<FileInfo>(null);
}
Stephen Cleary的回答很好地解释了这一点:永远不要返回
如果返回null而不是已完成的任务,则此代码将引发null引用异常:
await FunctionThatShouldRetunrTaskButReturnsNull();
而且即使在调试器中看到它,也很难理解正在发生什么。
所以,never,never,从返回
解释: