2016-06-14 53 views
-1

我有一個由許多不同的控件類型組成的應用程序,每個控件類型可以選擇性地與一個參數對象鏈接。返回空字符串而不是System.NullReferenceException錯誤

然後將這些保存在XML文件中以便稍後重新加載。要將控件鏈接到指定的參數,控件將存儲參數ID。然後在裝載和重新鏈接期間搜索這個文件。

但是,因爲這是可選的,如果沒有指定參數,當嘗試訪問可以理解的ID時會得到一個NullReferenceException。我可以通過檢查有問題的線路來解決這個問題。不過,我必須爲許多不同的控件類型執行此操作,而不僅僅是這個基本示例中顯示的一個參考。

所以我的問題是,有沒有一種優雅的方式來讓這個調用只返回一個空字符串,而不是這個異常?

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(); 
    } 
} 
+0

爲什麼不使用Try/Catch?或者我錯過了什麼? – uTeisT

+0

爲什麼要趕上例外,如果你能阻止它們? @uteist –

+0

我的意思是,把它放在try/catch中,如果它被捕獲,則返回String.Empty。或者,如果x是空的,然後做一些塊。我仍然懷疑我是否錯過了一些東西@PatrickHofman – uTeisT

回答

2

使用空傳播算子(購自C#6):

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

或爲下預#6使用:

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

好吧,你是對的。 –

+0

@PartickHofman我不知道這件事,看起來很完美......不幸的是,我使用C#4.5,目前無法升級! :( – TheGrovesy

+0

然後使用這個:'ci.LinkedParameter!= null?ci.LinkedParameter.ID:null;'。 –

0

使用針對ci.LinkedParameter一個簡單的測試。 ID as String:

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

or use simple try-catch block:

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

如果您不想更改模型CMIIW的行爲,則適用這些語句。

+0

它是'LinkedParameter',它是空的,而不是ID--它不會導致NullReferenceException。 – stuartd

0

你可以使用一個三元運算符,如果你不使用C#6:

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

這是一個if/else語句,但更緊湊,如果你有很多像這樣的線路更優雅。