提问者:小点点

返回空任务好还是返回null好?C#


我有一个异步方法,它将通过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;
    }

共3个答案

匿名用户

如果它没有找到结果,返回空任务还是null更好?

这里有几件事需要考虑:

null

因此,从方法返回的永远不应该是。但是,您仍然可以选择在常规任务中返回值。那就看你了。

我不确定哪个是最好的任务。

任务只是一个包装器。底层逻辑还是一样的。想想如果这个方法是同步的,它会是什么样子;您的返回类型是,如果找不到任何东西,则返回;还是您的返回类型是,如果找不到任何东西,则返回?选择同步方法后,将其包装在中,用于异步方法。

最后,我必须说:

    构造函数./li> 。/li> 。/li>

您的方法可以大大简化:

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;
}

或者,如果要返回的值(而不是task):

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的回答很好地解释了这一点:永远不要返回,否则会引发空引用异常,但我想添加一些内容:

    ,则返回一个已完成的任务,这可以通过返回来完成 /code>,则返回的已完成任务,这可以用(TResult)/code/li>来完成

如果返回null而不是已完成的任务,则此代码将引发null引用异常:

await FunctionThatShouldRetunrTaskButReturnsNull();

而且即使在调试器中看到它,也很难理解正在发生什么。

所以,never,never,从返回的非codeAsync/code>函数返回

解释:

  • 在返回/code>的非codeAsync/code>函数中,您需要显式地创建任务,并且存在返回而不是返回任务的危险。/li>
  • 在返回/code>的函数中,您只需返回或返回一个值,函数的结果将隐式转换为任务,因此没有返回的危险