0

我正在创建一个自定义配置部分(继承 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); }
}

或者有没有更好的方法?

提前致谢。

4

2 回答 2

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 的形式出现?

于 2009-08-04T15:33:27.907 回答
1

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

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

于 2009-08-04T15:33:47.983 回答