如何防止代码契约自动创建前提条件检查

本文关键字:创建 前提 条件 检查 何防止 代码 契约 | 更新日期: 2023-09-27 18:15:52

我遇到了微软代码契约的一个奇怪的行为,我不理解,也不知道如何解决。

我在我的项目中使用代码契约,通常检查前提条件(参数值),并且通常没有问题。然而,在这个类中,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不存在,则由于自动生成的契约,转换以一个不必要的异常结束,除非我完全关闭契约,否则我无法绕过该异常。

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

谢谢,Igor

如何防止代码契约自动创建前提条件检查

契约应用于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)");
}

据我所知,你不能禁用它而不禁用合同检查。