2011-12-08 150 views
4

我有一个这样的对象:在C#中处理空值

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编码为""还是会崩溃?

+1

2分钟太late..duh ... – Venki

+0

我有点疑惑关于“Object.Prop1”语法。如果MyObject确实实现了一个名为“Object”的接口,那么确定,但否则?如果“Object”是一个接口,最好称之为“IObject”。 –

+0

'我正在写一个自定义的JSON转换器'为什么? 'OutputJson.Add(“TheProp1”,MyObject.Prop1.Trim())'似乎不是一个好方法 –

回答

9

如果Prop1null您的代码将抛出NullReferenceException。你需要测试,如果Prop1为null调用Trim前:

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

或者你可以用null-coalescing operator更简明地做到这一点:

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

好的,谢谢提示很多! – frenchie

0

它将与一个NullReferenceException崩溃,因为你不能打电话Trim on null。你可以这样做,而不是:

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

我的理解是,空不空字符串。如果你想确保这个工作正常进行,只需将添加的值包含在if中,并将空字符串作为null占位符。当然,当你解码你的json时你需要采取适当的行动。

0

另一种方式来处理,这是使用私有成员来处理,你需要一个默认值属性的属性值,而不是空

Class MyObject 
{ 
    private string _prop1 = String.Empty; 

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

} 
0

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

0

可以使用DBNull类在填充物

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