我遇到了微软代码合同的奇怪行为,我不明白,也不知道如何解决。
我在我的项目中使用代码约定,通常用于检查前置条件(参数值),并且通常没有问题。但是,在这一个类中,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
不存在,则由于自动生成的合同,转换以不必要的异常结束,除非我完全关闭合同,否则我无法绕过。
有没有人有这方面的经验,可以指出我正确的方向?
谢谢, 伊戈尔
答案 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)");
}
据我所知,如果不禁用合同检查,则无法禁用它。