Return 空字符串而不是 System.NullReferenceException 错误

Return empty string instead of System.NullReferenceException error

我有一个应用程序,它由许多不同的控件类型组成,每个控件类型都可以有选择地link使用参数对象编辑。

然后将这些保存在 XML 文件中,以便稍后重新加载。 To link 控件到参数,在指定的地方,控件存储参数ID。然后在加载期间搜索并重新linked。

但是,由于这是可选的,如果未指定参数,我会在尝试访问可以理解的 ID 时收到 NullReferenceException。我可以通过检查相关线路来解决这个问题。但是,我将不得不为许多不同的控件类型执行此操作,并且不仅仅是这个基本示例中所示的一个参考。

所以我的问题是,有没有一种优雅的方法可以让这个调用只是 return 一个空字符串而不是这个异常?

public class Parameter
{
  public string ID;
}

public class LabelCtrl
{
  public string Name;
  public Parameter LinkedParameter;
}

public class XMLManager
{
  public void SaveControl(ControlInstance_LabelCtrl ci)
  {
    xmlWriter.WriteStartElement("ControlInstance_LabelCtrl");
    {
      xmlWriter.WriteElementString("Name", ci.Name);
      // Elegant way to insert empty string instead of causing NullReferenceException error
      xmlWriter.WriteElementString("LinkedParameter", ci.LinkedParameter.ID);
    }
    xmlWriter.WriteEndElement();
  }
}

使用 null 传播运算符(可从 C# 6 获得):

xmlWriter.WriteElementString("Name", ci.Name);
xmlWriter.WriteElementString("LinkedParameter", ci.LinkedParameter?.ID);

或者对于 C# 6 之前的版本使用:

ci.LinkedParameter != null ? ci.LinkedParameter.ID : null;

使用针对 ci.LinkedParameter.ID 作为字符串的简单测试:

if (!String.IsNullOrEmpty(ci.LinkedParameter.ID)) {
    xmlWriter.WriteElementString("LinkedParameter", ci.LinkedParameter.ID);
}
else {
    xmlWriter.WriteElementString("LinkedParameter", String.Empty);
}

或使用简单的 try-catch 块:

try {
    xmlWriter.WriteElementString("LinkedParameter", ci.LinkedParameter.ID);
} 
catch (e) {
    xmlWriter.WriteElementString("LinkedParameter", String.Empty);
}

如果您不想更改模型 CMIIW 的行为,则这些陈述适用。

如果您不使用 C# 6,则可以使用三元运算符:

xmlWriter.WriteElementString("LinkedParameter", (ci.LinkedParameter != null) ? ci.LinkedParameter.ID : "");

它是一个 if/else,但如果你有很多这样的行,它会更紧凑、更优雅。