首页 新闻 赞助 找找看

.NET当中的Code Contracts 前置条件能否用来代替客户端参数验证?

0
悬赏园豆:10 [已解决问题] 解决于 2014-04-21 21:13

比如这个例子:

public static Time Parse(string value)
    {
        string regXExpres = 
           "^([0-9]|[0-1][0-9]|2[0-3]):([0-9]|[0-5][0-9])$|^24:(0|00)$";
        Contract.Requires(value != null);
        Contract.Requires(new Regex(regXExpres).IsMatch(value));
        string[] tokens = value.Split(':');
        int hour = Convert.ToInt32(tokens[0], CultureInfo.InvariantCulture);
        int minute = Convert.ToInt32(tokens[1], CultureInfo.InvariantCulture);
        return new Time(hour, minute);
    }
    public static Time Parse(string value)
    {
        if (value == null)
        {
            throw new ArgumentNullException("value");
        }
        string[] tokens = value.Split(':');
        if (tokens.Length != 2)
        {
            throw new FormatException("value must be h:m");
        }
        int hour = Convert.ToInt32(tokens[0], CultureInfo.InvariantCulture);
        if (!(0 <= hour && hour <= 24))
        {
            throw new FormatException("hour must be between 0 and 24");
        }
        int minute = Convert.ToInt32(tokens[1], CultureInfo.InvariantCulture);
        if (!(0 <= minute && minute <= 59))
        {
            throw new FormatException("minute must be between 0 and 59");
        }
        return new Time(hour, minute);
    }

问题:

我能否使用Contract.Requires()来代替那些If(){ throw } 来进行参数验证,然后抛出自己定义的异常?

本人刚刚接触Code Contracts,因为我不想代码当中老是重复使用if(){ throw }进行参数验证,做很多重复工,想找一种更简洁有效的编码方式。或者使用类似:Throw.ArgumentNull();

PS:各位有关于这方面的资源或者建议,请多多指点^_^

 

kaleyroy的主页 kaleyroy | 菜鸟二级 | 园豆:360
提问于:2014-04-20 10:59
< >
分享
最佳答案
0

可以,不过默认是Contract.Require是啥都不干的,需要安装Code Contracts Dev插件,并且将检查选项开启到。  ReleaseRequiresReleaseRequires以上,这样它和if throw的效果是一样的 。

具体的可以看我以前写的文章:http://www.cnblogs.com/TianFang/p/3485005.html

收获园豆:10
天方 | 大侠五级 |园豆:5407 | 2014-04-20 12:05

谢谢,基本上明白怎么用啦^_^

kaleyroy | 园豆:360 (菜鸟二级) | 2014-04-21 21:13
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册