在C#中处理空值

4

我有一个对象,像这样:

class MyObject
{
    public string Object.Prop1 { get; set; }
    public string Object.Prop2 { get; set; }
}

我正在编写一个自定义的JSON转换器,我将这个对象序列化为以下格式:

Dictionary<string, object> OutputJson = new Dictionary<string, object>();

OutputJson.Add("TheProp1", MyObject.Prop1.Trim());

如果由于某种原因 Prop1null,那么代码会将 TheProp1 编码为 "" 还是崩溃?

我对“Object.Prop1”语法有点困惑。如果MyObject实现了一个名为“Object”的接口,那么没问题,但如果没有呢?如果“Object”是一个接口,最好称其为“IObject”。 - Olivier Jacot-Descombes
我正在编写一个自定义的JSON转换器。为什么?因为OutputJson.Add("TheProp1", MyObject.Prop1.Trim())似乎不是一种好的方式。 - L.B
@L.B:我的方法可以运行,但如果有更好的方式,我很感兴趣。你有什么建议吗? - frenchie
@frenchie,你可以使用其中一个好的JSON序列化程序,例如JavaScriptSerializer、DataContractJsonSerializer、fastJSON、SimpleJson、Json.Net、Jsonfx等。我的最爱是http://json.codeplex.com/。 - L.B
6个回答

11

如果Prop1null,则您的代码将抛出一个NullReferenceException异常。在调用Trim之前,您需要测试Prop1是否为null:

MyObject.Prop1 == null ? "" : MyObject.Prop1.Trim()

或者您可以使用空值合并运算符更简洁地实现:

(MyObject.Prop1 ?? "").Trim()

1

另一种处理方法是使用私有成员来处理属性值,特别是在需要默认值而不是null的属性中。

Class MyObject
{
     private string _prop1 = String.Empty;

     public string Object.Prop1 { 
          get
           {
                return _prop1;
            } 
           set
           {
                _prop1 = value;
            } 
      }

}

0

我的理解是,null不等于空字符串。如果你想确保这个方法能够正常工作,只需在添加的值上加一个if判断,并将空字符串作为null的占位符插入其中。当解码json时,当然你需要采取适当的操作。


0

如果您的MyObject不需要多态行为,可以将其声明为结构体而不是类。它将具有值语义,并且每个值都将使用其默认值进行初始化。我假设在您的类内部只有结构类型(例如int、string、double)。


0

它将会因为你无法在null上调用Trim而崩溃,抛出NullReferenceException异常。你可以尝试这样做:

OutputJson.Add("TheProp1", MyObject.Prop1 == null ?
                               string.Empty :
                               MyObject.Prop1.Trim());

0

您可以使用 DBNull 类来填充对象

UserName = DBNull.Value != reader["UserName"] ? reader["UserName"].ToString() : default(string);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接