如何防止代码契约自动创建前提条件检查
本文关键字:创建 前提 条件 检查 何防止 代码 契约 | 更新日期: 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)");
}
据我所知,你不能禁用它而不禁用合同检查。