2009-08-04 56 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

相关问题