2009-08-04 45 views
0

我正在創建一個自定義配置節(繼承System.Configuration.ConfigurationSection),並且我想知道是否必須對可爲Nullable int的ConfigurationProperty進行值驗證。即,我必須這樣做:我必須對類型爲Nullable <int>的房產進行驗證嗎?

[ConfigurationProperty("NullableInt", IsRequired = true)] 
public int? NullableInt 
{ 
    get 
    { 
     return String.IsNullOrEmpty(Convert.ToString(this["NullableInt"])) 
        ? (int?) null 
        : Convert.ToInt32(this["NullableInt"]); 
    } 
    set 
    { 
     this["NullableInt"] = value.HasValue ? Convert.ToString(value) : ""; 
    } 
} 

或者,我可以做這樣的事情:

[ConfigurationProperty("NullableInt", IsRequired = true)] 
public int? NullableInt 
{ 
    get{ return Convert.ToInt32(this["NullableInt"]); } 
    set{ this["NullableInt"] = Convert.ToString(value); } 
} 

還是有更好的辦法全在一起嗎?

在此先感謝。

回答

1

那麼,如果值爲null,那麼Convert.ToInt32將返回0,如果表達式不是數字,它將拋出異常..所以是的,你需要驗證! - 特別是因爲你希望該屬性返回null爲null而不是0(這是前面指出的Convert.ToInt32將返回null)

此外,指出Int32.Parse()功能,該功能非常類似於Convert.ToInt32(),但它拋出一個ArgumentNullException如果試圖解析空 - 在這裏這是Convert.ToInt32和Int32.Parse()

+0

在這種情況下,你會使用Convert.ToInt32()Int32.Parse()嗎?我在想,String.IsNullOrEmpty()會捕獲Int32.Parse()會失敗的任何場景,難道不會? – 2009-08-04 16:11:59

+0

要麼工作..它真的取決於你的最終目標是什麼,但不要忘記,當表達式不是數字的時候轉換器會拋出異常(即'a123bcd')所以,也許try catch將是有序的。 。和使用Int32.Parse()來簡化事情.. – 2009-08-04 16:30:49

1

第一個是更完整的答案。

第二個在很多情況下都能正常工作,但在邊緣情況下失敗。在寫這樣的章節時,你必須確保屬性的簡單不變式。即所有的int值都是如下的情況?

int? v1 = GetSomeNullableIntValue(); 
obj.NullableInt = v1; 
int? v2 = obj.NullableInt; 
bool equal = v1 == v2; // Must be true 

你的第二個例子並沒有爲int的空值做出這樣的保證。考慮如何一個null int?將在這種情況下代表?傳入一個null int?對該集合的價值將會拋出並因此不能被添加到集合中。同樣,假設它在配置中被存儲爲null或String.Empty,它將不會再次作爲null int返回?

+0

感謝之間的主要區別,這兩個答案真的有幫助。由於某種原因,我認爲Miky D's被接受是因爲我更瞭解它。可能缺乏咖啡。 – 2009-08-04 16:47:16

相關問題