2010-07-09 69 views
4

我正在閱讀XML格式的一些數據並將它放在我的類中,我只是想知道最佳做法是什麼關於字段可以是空的,如果它們是空的,則有一個默認值。沒有提供的值不需要寫回文件。我應該公開一個可爲空或HasFoo字段?

我在考慮使用可爲空的類型,但是,指定默認值的代碼中的最佳方式是什麼(儘管我不需要每個字段的默認值,因爲並非所有字段都有指定的默認值或默認值值爲0)

目前我使用的是這樣的:

class SomeElement 
{ 
    public const int DefaultFoo = 123; 

    public int? Foo { get; set; } 
} 

,但不知道下面會更明顯:

class SomeElement 
{ 
    // Setting HasFoo to false will set Foo to the default value 
    public bool HasFoo { get; set; } 
    // Setting Foo to anything will set HasFoo to true 
    public int Foo { get; set; } 
} 

由於某些類有很多屬性,第二個選項將在類中創建更多的方法,但是,如果您不關心Foo是否具有值,則可能更易於使用。

的最後一種選擇可能會使用在基類或者一個靜態方法擴展方法來使默認容易獲得(基於this想法)

// In some method using the class 
int value = SomeElementBase.GetValueOrDefault(() => myObj.Foo); 
// or an extension method 
int value = myObj.GetValueOrDefault(x => x.Foo); 

我仍然供應DefaultFoo領域但靜態/擴展方法可能會更容易訪問?

你的想法是什麼?有沒有人遇到過這個問題?我應該只使用默認值,並且在保存迴文件忽略等於默認值的字段時?

+0

您需要公開非valuetype對象嗎? (即參考)? – 2010-07-09 21:09:09

+0

一些元素是字符串,但沒有一個是自定義類。 – Samuel 2010-07-09 21:17:51

回答

8

我認爲可以爲空的字段是可取的。沒有多餘的代碼保持它們在你的文件中同步,意圖非常明確,並且你可以訪問Foo.HasValue,這讓我的想法更好地表達你的意圖,而不是一個單獨的HasValue屬性。

+0

我也喜歡更多帶空格的版本。如果另一個用戶只是懶惰地檢查這個類,那麼他最終會讀取錯誤的值,因爲他訪問value屬性而不檢查狀態。 – HCL 2010-07-09 21:11:11

+0

我同意。通過使用'Nullable',該定義被嚴格包含,並且您立即知道它可能爲空。如果你做兩種方法,理解之間的距離會增加,這會導致混淆。 – 2010-07-09 21:11:13

+0

關於混淆你有一個好的觀點,謝謝。默認值呢? const字段是最好的方法嗎?我想在代碼中你可以有:myObj.Foo ?? SomeElement.DefaultFoo – Samuel 2010-07-09 21:21:41

2

我會使用組合的空值作爲沒有默認值的值,併爲默認值覆蓋默認值(假設您實際上並不需要知道該值是否爲你得到的默認值是與否):

class SomeElement { 
    public int? NoDefault { 
     get; set; 
    } 

    private int? m_hasDefault; 
    public int? HasDefault { 
     set { m_hasDefault = value; } 
     get { 
     if(m_hasDefault.HasValue) 
      return m_hasDefault; 
     else 
      return WhateverTheDefaultShouldBe; 
     } 
    } 
} 

還是返回在兩種情況下nullables以保持一致性,並隱藏有默認值的屬性和那些不給調用之間的任何差別代碼(通過這種方式,您可以輕鬆更改哪些值在類中具有缺省值而不影響使用該類的代碼)。

相關問題