星空网 > 软件开发 > ASP.net

利用.NET Code Contracts实现运行时验证

.NET的Contract类库是Declarative Programming实践的一部分,可以对日常编程带来很多好处:

  • 提高代码可读性,使用者一看Require, Ensure就知道这方法接受什么输入,产生什么输出。
  • 减少重复的验证代码
  • 配合第三方工具,可以方便静态代码分析和单元测试,方便产生API文档,这些功能可以参见Code Contract主页

Contract类本身已经在.NET 4.0之后集成进了System.Diagnostics.Contracts命名空间,但如果想使用Contract方法实现运行时的验证,还需要单独安装一个VS插件。装好之后,去项目属性里开启运行时检查:

利用.NET Code Contracts实现运行时验证

这样每次编译项目的时候,插件里的ccrewrite工具会将Contract方法编译成有效的检查代码分别注入函数体的首尾。所以即使你把Contract.Ensures检查放在函数开头部分(这也是推荐做法),编译之后这部分逻辑依然会出现在函数末尾,检查函数结束条件是否满足。

需要注意的是,如果想要在Debug和Release Build都使用运行时验证功能,则需要在项目设置为Debug和Release编译时,分别设置打开Runtime check。

Contract的基本使用包括Requires和Ensures,Requires在方法开始时检查初始条件是否满足,通常用来做参数验证。Ensures方法用来在方法结束时检查执行结果是否符合预期,比如可以放在Property set方法的末尾检查Property是否被正确设置。

当检查失败时,默认会抛出ContractException,使用泛型的Requires和EnsuresOnThrow可以指定其他类型的异常。

    public async void GetPage(string entryPageUrl)    {      Contract.Requires<ArgumentException>(Uri.IsWellFormedUriString(entryPageUrl, UriKind.Absolute));      ...    }

 

Contract有一个很酷的feature,就是可以在接口里定义一些检查,要求所有的实现都满足这些检查条,这样就不用在接口的每个实现里分别定义相同的检查逻辑了,非常的优雅,也符合Declaration Programming的初衷。

以下是示例代码:

  [ContractClass(typeof(IBookRepositoryContract))]  public interface IBookRepository  {    string BookTitle { get; set; }    void Create(string name, Stream blob);  }  [ContractClassFor(typeof(IBookRepository))]  sealed class IBookRepositoryContract : IBookRepository  {    public string BookTitle    {      get      {        return null;      }      set      {        Contract.Requires(!string.IsNullOrWhiteSpace(value), "Book title must not be empty.");        Contract.Requires(string.IsNullOrWhiteSpace(this.BookTitle), "Book title has already been set.");      }    }    public void Create(string name, Stream blob)    {      Contract.Requires<InvalidOperationException>(!string.IsNullOrWhiteSpace(this.BookTitle), "Book title hasn't been set");    }  }

这样所有IBookRepository的实现类都无需再定义这些检查了。

 

参考资料:

http://research.microsoft.com/en-us/projects/contracts/userdoc.pdf

http://blog.csdn.net/atfield/article/details/4465227

http://www.cnblogs.com/yangecnu/p/The-evolution-of-argument-validation-in-DotNet.html

 




原标题:利用.NET Code Contracts实现运行时验证

关键词:.NET

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

亚马逊个人运营之路,选择大于努力!:https://www.ikjzd.com/articles/59878
收藏:亚马逊产品定价的策略很多,这几点最重要!:https://www.ikjzd.com/articles/59883
速看!巴西海关扣货的7大原因!:https://www.ikjzd.com/articles/59886
本周外贸大事!美国加税可退,日本十连休影响交货......:https://www.ikjzd.com/articles/59890
紧急注意:中东地区信用证操作风险防范!:https://www.ikjzd.com/articles/59892
跨境电商没那么难,现在开始并不晚:https://www.ikjzd.com/articles/59894
武陵山大裂谷周围景点 武陵山大裂谷周围景点图片:https://www.vstour.cn/a/411233.html
南美旅游报价(探索南美洲的旅行费用):https://www.vstour.cn/a/411234.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流