【问题标题】:Dealing with nulls in as little code as possible用尽可能少的代码处理空值
【发布时间】:2016-01-28 21:38:43
【问题描述】:

我对 C# 比较陌生,所以请多多包涵!如果字典中没有任何内容,我更愿意编写的代码会抛出一个空引用,这是应该的。我不得不将它转换为字符串,因为字典返回一个对象:

string mainDirectorsInZim = (string)zimOrganisation.OrganizationFields["main_director"];

我必须编写的代码来解决这个问题?

if (zimOrganisation.OrganizationFields.ContainsKey("main_director"))
  {
      mainDirectorsInZim = (string)zimOrganisation.OrganizationFields["main_director"];
  }
  else
  {
     mainDirectorsInZim = null;
  }

我没有多少这些要写,而且似乎效率低下。有没有更好的方法来做到这一点?

【问题讨论】:

  • 第一个代码的哪一部分抛出NullReferenceException?它只会在字典为空时抛出。你确定它不会抛出KeyNotFoundException
  • 看看这对你有没有帮助:Cleaner way to do a null check in C#?

标签: c#


【解决方案1】:

我尝试使用 TryGetValue 方法稍微减少代码,但正如 serhiyb 在 cmets 中指出的那样,由于必须将 object 转换为 string,它无法工作。

但这应该会更有效一些。

string mainDirectorsInZim = null;
object tmp;

if (zimOrganisation.OrganizationFields.TryGetValue("main_director", out tmp))
{
    mainDirectorsInZim = (string)tmp;
}

OTOH,您可以先将字符串初始化为 null,然后删除 else 块,如果您碰巧发现它更容易理解,因为它更接近您现有的代码。

string mainDirectorsInZim = null;

if (zimOrganisation.OrganizationFields.ContainsKey("main_director"))
{
    mainDirectorsInZim = (string)zimOrganisation.OrganizationFields["main_director"];
}

【讨论】:

  • 很好的答案,但可能需要额外的变量,因为第二个通用参数不是字符串(对象可能基于 OP 代码)。
  • 但是你的方法更好,因为字典索引器只被调用一次。
猜你喜欢
  • 1970-01-01
  • 2013-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-12
  • 1970-01-01
  • 2019-08-31
  • 1970-01-01
相关资源
最近更新 更多