如何防止代码合同自动创建前置条件检查?

时间:2011-11-28 13:25:17

标签: c# .net code-contracts

我遇到了微软代码合同的奇怪行为,我不明白,也不知道如何解决。

我在我的项目中使用代码约定,通常用于检查前置条件(参数值),并且通常没有问题。但是,在这一个类中,Code Contracts模块似乎会自动在所有带参数的方法上插入前置条件检查。

例如,这是我的原始代码:

public override void WriteRaw(string data)
{
    this.writer.WriteRaw(data);
}

这是我用Reflector反编译程序集时所看到的:

public override void WriteRaw(string data)
{
    __ContractsRuntime.Requires(string.IsNullOrEmpty(data) == 0, null, "!string.IsNullOrEmpty(data)");
    this.writer.WriteRaw(data);
Label_0028:
    return;
}

即使经过详尽的研究和对我的代码的分析,我能想到的最好的诊断是它只发生在继承/实现抽象System.Xml.XmlWriter的类上。在所有其他情况下,只有我手动添加合同时,合同才会存在。

在99%的情况下,我欢迎通过代码合同进行自动参数检查(前提是我可以控制它)。但是有问题的代码是一个包装XML编写器,XslCompilerTransform使用它来省略正确的XHTML。如果XSL样式表包含<xsl:value-of select="xyz" disable-output-escaping="yes"/>,其中xyz不存在,则由于自动生成的合同,转换以不必要的异常结束,除非我完全关闭合同,否则我无法绕过。

有没有人有这方面的经验,可以指出我正确的方向?

谢谢, 伊戈尔

1 个答案:

答案 0 :(得分:4)

合同适用于抽象XmlWriter界面。您可以通过查看代码契约安装目录中的合同引用程序集(在我的机器上它位于Reflector中的C:\ Program Files(x86)\ Microsoft \ Contracts \ Contracts.NETFramework \ v4.0)中看到这一点。 当您覆盖已应用契约的虚拟/抽象方法或接口方法时,它们会自动编入您的代码中。

WriteRaw的合同是:

public virtual void WriteRaw(string data)
{
    Contract.Requires(!string.IsNullOrEmpty(data), null, "!string.IsNullOrEmpty(data)");
}

据我所知,如果不禁用合同检查,则无法禁用它。