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,但如果你有很多这样的行,它会更紧凑、更优雅。
我有一个应用程序,它由许多不同的控件类型组成,每个控件类型都可以有选择地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,但如果你有很多这样的行,它会更紧凑、更优雅。