2013-06-12 79 views
8

我現在處於兩難的境地。的(降低的)任務是重新設計如下的數據保持器類設置可爲空屬性的默認值的首選方法是?

class Stuff 
{ 
    public String SomeInfo { get; set; } 
} 

以容納不能返回的需求。我可以想出兩種方法來實現這一點,經過15分鐘的深思熟慮後,我根本無法決定哪一個是首選。

構造函數的方法。

class Stuff 
{ 
    public String SomeInfo { get; set; } 
    public Stuff() { SomeInfo = String.Empty; } 
} 

財產的方法。

class Stuff 
{ 
    private String _SomeInfo; 
    public String SomeInfo 
    { 
    get { return _SomeInfo ?? String.Empty; } 
    set { _SomeInfo = value; } 
    } 
} 

注意,東西實例的創建可以使用構造以及初始化完成,如果這是任何意義。據我所知,不會有任何其他限制(但你知道客戶的規格並不總是反映現實)。

+9

嗯 - 您的第一個選項不符合您的要求 - 因爲我仍然可以將該屬性設置爲null。 #2是你唯一真正的選擇。 –

+1

如果通過初始化您意味着某種形式的反序列化,請注意某些實現不會執行構造函數代碼。 – Rafal

+1

#2上的另一個小調味道可能是在設置值時驗證輸入,而不是在檢索時驗證輸入。如果你發現你經常檢索'null/Empty'值,而不是在進行設置時優先檢查一次/很少。編輯:請注意,這假定您足夠警惕不要將後臺字段設置爲空。 –

回答

17

只能保證,當你使用屬性null永遠不會返回:

class Stuff 
{ 
    private String _SomeInfo; 
    public String SomeInfo 
    { 
    get { return _SomeInfo ?? String.Empty; } 
    set { _SomeInfo = value; } 
    } 
} 

同樣的方法是通過文本的控件使用(例如ASP.NET),其中Text屬性永遠不會返回nullString.Empty

例如(ILSpy):

// System.Web.UI.WebControls.TextBox 
public virtual string Text 
{ 
    get 
    { 
     string text = (string)this.ViewState["Text"]; 
     if (text != null) 
     { 
      return text; 
     } 
     return string.Empty; 
    } 
    set 
    { 
     this.ViewState["Text"] = value; 
    } 
} 
5

還可以實現邏輯的二傳手,而不是在吸氣,這樣,你的後場始終有一個有效值

class Stuff 
{ 
    private String _SomeInfo = string.Empty; 
    public String SomeInfo 
    { 
    get { return _SomeInfo; } 
    set 
    { 
     if (value != null) 
     { 
     _SomeInfo = value; 
     } 
    } 
    } 
} 
+0

您可能想要更新'if'檢查來設置'String.Empty',而不是無所事事。例如:'myStuff.SomeInfo =「Hello!」; myStuff.SomeInfo = null; Console.WriteLine(myStuff.SomeInfo); //打印Hello!'編輯:可能與_someInfo = value一樣簡單String.Empty;' –

+0

@ChrisSinclair我認爲這真的取決於OP。也可以決定在發生錯誤時拋出異常... –

+0

+1我同意有幾個選項。我只是建議這樣做,因爲分配'String.Empty'將與OP現在演示的行爲一致。 –

4

剛爲此添加另一個答案,您還可以在單​​個語句中將一個默認值設置爲一個字符串對象;

class Stuff 
{ 
    private String Something {get; set;} = string.Empty; 
}