C# dotnet "Require" 和断言

从 Scala 语言开始,我习惯于在我的代码中添加require语句。


我会将它用于永远不应该被违反的事情,它是一种健全性检查,也是代码中的一种“实时评论”。


这是我想要的行为


// C#

if (!(x > 0)) {

  throw new Exception($"x must be positive but was ${x}")

}

但这很难阅读,如果函数顶部有很多它们,那将是一团糟。


在 Scala 中,我习惯于这样做:


// Scala


require(x > 0, s"x must be positive but was ${x}")


// or just


require(x > 0)

打字并不费力,require(x>0)而且可读性很强。


我发现这些在 Scala 中开发时为我节省了很多时间,输入它们非常容易,而且通常健全性检查会很快发现错误。


在 C# 中执行此操作的公认方法是什么?


我看到有“代码合同”,我尝试使用这些,但它们似乎在 .NET Core 中根本不起作用。


RISEBY
浏览 150回答 2
2回答

暮色呼如

代码合同代码契约允许您在代码中指定前置条件和后置条件。Contract.Requires(x&nbsp;!=&nbsp;null);和Contract.Requires<ArgumentNullException>(x&nbsp;!=&nbsp;null,&nbsp;nameof(x));对于后置条件:Contract.Ensures(this.F&nbsp;>&nbsp;0);和Contract.EnsuresOnThrow<T>(this.F&nbsp;>&nbsp;0);还有其他变化。查看代码合同命名空间。

慕仙森

在方法的开头看到一长串列表是相对标准的if ... throw,但是有Debug.Assert(用于从发布版本中删除的断言)和Trace.Assert(在发布版本中保留断言)方法似乎与 Scalarequire方法非常相似你提到的。有关它们如何工作和不同重载的详细信息,请参阅MSDN 上有关断言的这篇文章。在你的情况下,你可以写Trace.Assert(x&nbsp;>&nbsp;0,&nbsp;$"x&nbsp;must&nbsp;be&nbsp;positive&nbsp;but&nbsp;was&nbsp;${x}");
打开App,查看更多内容
随时随地看视频慕课网APP