gpt4 book ai didi

c# - 如何防止代码契约(Contract)自动创建前提条件检查?

转载 作者:行者123 更新时间:2023-11-30 21:10:47 26 4
gpt4 key购买 nike

我遇到了 Microsoft 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 的类上.在所有其他情况下,契约(Contract)只有在我手动添加时才会存在。

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

有没有人对此有一些经验并能指出正确的方向?

谢谢,伊戈尔

最佳答案

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

WriteRaw 的合约是:

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

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

关于c# - 如何防止代码契约(Contract)自动创建前提条件检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8296434/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com