gpt4 book ai didi

c# - 代码契约和重载

转载 作者:太空宇宙 更新时间:2023-11-03 11:19:16 25 4
gpt4 key购买 nike

假设我正在编写一个实用程序库,它定义了一个具有两个重载的方法:

public static class MyClass
{
public static void DoSomething(string myValue, bool myFlag)
{
Contract.Requires<ArgumentNullException>(myValue != null);
CallExternalMethod(myValue);
if(myFlag){
AlsoCallOtherMethod(myValue);
}
}

public static void DoSomething(string myValue)
{
Contract.Requires<ArgumentNullException>(myValue != null);
DoSomething(myValue, true);
}
}

作为最佳实践,我只在一个方法中定义逻辑,并使用重载来指定默认参数(.Net 3.5,我不能使用 .Net 4 默认值参数)。

如您所见,我还使用合约验证输入。

逻辑只在第一个方法里,第二个Contract是不是没用了?

关于运行时检查,我知道它没有用,但是静态检查器呢?它是否足够聪明以理解我的模式?

最佳答案

我完全不同意BonyT's answer .

代码契约是文档和方法契约的一部分,就像类型和名称一样。用户/开发人员没有理由假设您只是调用了另一个方法重载而没有别的。找出哪些契约(Contract)适用于方法不应该是猜谜游戏。如果对参数或返回值有约束,请使用代码契约对其进行记录,即使您在内部 - 对其他所有人隐藏 - 只需调用另一个方法。

您一定不要将代码契约视为只​​是一个断言工具:控制流运行到另一个重载,它检查参数,所以我不必在这里这样做。您必须将其视为文档。

在实际层面上:添加代码契约还会将这些契约添加到您生成的 XML 文档中。静态检查器和代码契约(Contract)编辑器扩展等工具可以向用户显示契约(Contract)。可以找到其他一些很好的论据 in this related post by Pascal Cuoqthis post by Jon Skeet .

但是,从运行时的角度来看,它多余的。至于运行时开销:大多数检查都相对较小并且与性能无关。一些检查可能与性能有关(最显着的是对集合、数组和枚举的检查),但可以在项目的代码契约(Contract)属性对话框中单独禁用这些检查(例如对于发布版本)。这同样适用于一般契约(Contract):您可以将检查降低到您想要的任何级别,以便在真正关键的时候提高性能。如果您构建合约程序集,用户仍将获得静态检查。

总结一下。指定冗余要求和确保的缺点:

  • 相同的条件可能会被检查两次或更多次
  • 由于多重检查(如果您不禁用它)对性能产生微小的负面影响
  • 更多输入(但请参阅 these snippets)

专业人士:

  • 代码文档
  • 生成的 XML 文档
  • 代码用户的静态检查器按预期工作
  • 代码契约编辑器扩展作品
  • ArgumentException 要求发生在被调用的方法中,而不是发生在遥远的深处

关于c# - 代码契约和重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11556324/

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