我是否必须对Nullable <int>类型的属性进行验证?</int>

时间:2009-08-04 15:27:41

标签: .net nullable

我正在创建一个自定义配置部分(继承System.Configuration.ConfigurationSection),我想知道是否必须对一个Nullable int的ConfigurationProperty进行值验证。即,我必须这样做:

[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); }
}

还是有更好的方式在一起吗?

提前致谢。

2 个答案:

答案 0 :(得分:1)

第一个是更完整的答案。

第二个在许多情况下都可以正常工作但在边缘情况下失败。在编写这样的部分时,您必须确保属性的简单不变量。即对于int的所有值,以下内容都适用

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

你的第二个例子没有对int的null值做出这样的保证。考虑一下null int怎么样?将在这种情况下代表?传入null int?该集合的值将抛出,因此无法添加到集合中。同样,假设它在配置中存储为null或String.Empty,它将不再作为null int再次出现?

答案 1 :(得分:1)

好吧,如果值为null,Convert.ToInt32将返回0,如果表达式不是数字,它将抛出异常..所以是的,你想要验证! - 特别是因为你希望属性为null返回null而不是0(这是Convert.ToInt32将返回null,如前所述)

此外,指出Int32.Parse()函数可能很有用,它与Convert.ToInt32()非常相似,但如果您尝试解析 null则抛出ArgumentNullException - 这是Convert.ToInt32和Int32.Parse()

之间的主要区别