c# – 如何在接口中配置代码约定

我无法在课堂上配置代码合同.我已经按照文档和示例,但它不起作用.

我想将Code Contracts条件插入我的界面,这里是我的代码

界面

[ContractClass(typeof(ArticleBLLContract))]
 public interface IArticleBLL
 {
    int getArticleNSheet(string IdBox);
    IEnumerable<IArticle> getArticleValue(string IdBox,string IdLanguage);
}

合同类

[ContractClassFor(typeof(IArticleBLL))]
public sealed class ArticleBLLContract : IArticleBLL
{
    int IArticleBLL.getArticleNSheet(string IdBox)
    {
        Contract.Requires<ArgumentOutOfRangeException>(!String.IsNullOrEmpty(IdBox),"IdBox has no valid value");                        

        return default(int);
    }

    IEnumerable<Base.Article.IArticle> IArticleBLL.getArticleValue(string IdBox,string IdLanguage)
    {
        Contract.Requires<ArgumentOutOfRangeException>(!String.IsNullOrEmpty(IdBox),"IdBox has no valid value");
        Contract.Requires<ArgumentOutOfRangeException>(!String.IsNullOrEmpty(IdLanguage),"IdLanguagehas no valid value");

        Contract.Ensures(Contract.Result<IEnumerable<Base.Article.IArticle>>() != null,"Return value is out of Range");

        return default(IEnumerable<Base.Article.IArticle>);
    }        
}

适用合同的类

public class ArticleBLL : IArticleBLL
{

    public int getArticlNSheet(string IdBox)
    {
        try
        {
            return _Dal...
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    public IEnumerable<IArticle> getArticleValue(string IdBox,string IdLanguage)
    {
        IEnumerable<IArticle> article = null;

        try
        {
            article = _Dal...

            return article;

        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
}

我试图在这一行插入一个断点

Contract.Requires<ArgumentOutOfRangeException>(!String.IsNullOrEmpty(IdBox),"IdBox has no valid value");

但是当我打电话给方法时,它永远不会通过这里
这是我的项目配置

有什么不对?

谢谢!

解决方法

根据迄今为止的评论总重写

我已经创建了一个类库项目,并将接口及其契约类放在那里.我已将其设置为“标准合同要求”,运行时前后检查和构建合同参考程序集(我为调试和发布设置了相同的选项).

然后,我得到了一个控制台应用程序,其中有一个实现该接口的类,并设置了“标准合同要求”,运行时前置和后置检查(再次,在调试和发布之间设置相同).

在Debug或Release模式下运行它,我在尝试调用getArticleNSheet时遇到ArgumentOutOfRangeException.

除了切换到“标准合同要求”之外,上述内容与您当前的设置不符?

而且,事实上,我以前错了.对于“标准合同要求”,我实际上能够在调试时在合同类中遇到断点.我不确定Wizardry能够做到这一点 – 因为它不是字面上运行该类中的代码 – 事实证明你可以在合同类中重写方法

int IArticleBLL.getArticleNSheet(string IdBox)
    {
        Contract.Requires<ArgumentOutOfRangeException>(!String.IsNullOrEmpty(IdBox),"IdBox has no valid value");

        throw new NotImplementedException();
    }

您可以在Contract.Requires行上放置一个断点,它似乎点击它(在关于文件不匹配的警告之后,可能是由于重写).但假设您已传递非空字符串,则它不会抛出NotImplementedException.

相关文章

原文地址:http://msdn.microsoft.com/en-us/magazine/cc163...
前言 随着近些年微服务的流行,有越来越多的开发者和团队所采...
最近因为比较忙,好久没有写博客了,这篇主要给大家分享一下...
在多核CPU在今天和不久的将来,计算机将拥有更多的内核,Mic...
c语言输入成绩怎么判断等级
字符型数据在内存中的存储形式是什么