如何在C#中显示方法永远不会返回null(按合同设计)

Sta*_*low 9 c# design-by-contract

我有一个永远不会返回null对象的方法.我想说清楚,以便我的API用户不必编写如下代码:

if(Getxyz() != null)
{
  // do stuff
}
Run Code Online (Sandbox Code Playgroud)

我该如何展示这个意图?

Oli*_*lam 10

不可思议的是,C#没有办法内置

您可以记录此事实,但不会自动检查.

如果您正在使用resharper,那么可以将其设置为在方法标记为[NotNull]属性时正确检查.

否则,您可以使用Microsoft Contracts库并在您的方法中添加类似于以下内容的内容,但对于这样一个简单的注释,这是非常多的额外措辞.

Contract.Ensures(Contract.Result<string>() != null)
Run Code Online (Sandbox Code Playgroud)

Spec#通过允许一个解决了这个问题!在类型之后将其标记为非null类型,例如

string! foo
Run Code Online (Sandbox Code Playgroud)

但Spec#只能用于定位.NET2,并且已被Code Contracts库篡夺.

  • 如果要返回非空字符串,则使用结构无效.你可以返回一个包含可能为null的字符串的非null结构,但是如何更好? (2认同)

Jas*_*son 6

除非你使用的是基于System.ValueType的类型,否则我认为你运气不好.最好在函数的XML /元数据注释中清楚地记录这一点.