2011-12-08 323 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);