【发布时间】:2011-12-04 12:25:19
【问题描述】:
关于.NET 中不可为空的引用类型的支持存在许多问题。最大的希望是代码合约,但它仅限于预算有限的人的运行时检查。
至于代码合同以外的方法,Jon Skeet 几年前就此事写了一篇blog post,其中一位评论者提供了一个看起来很有用的NonNull struct,它修改了 IL 以禁用默认构造函数。这似乎是一个很好的方法,我可以想象扩展它以提供各种不可为空的microtypes。 IL 操作可能是由结构上的属性触发的构建后步骤,例如
//Microtype representing a non-zero age, so we want to disable the default ctor
[NoDefaultConstructor]
public struct Age
{
public Age(int age)
{
// Implementation (including validation) elided
}
}
在我进一步调查之前,我想问一下是否有人知道这可能会导致任何问题?什么都想不出来。
【问题讨论】:
-
您需要非空引用类型的用例是什么?
-
对于那些预算延伸到 ReSharper 的人来说,那里有一些有用的无效性检查功能(尽管显然不如昂贵的 VS 版本中的合同内容那么完整)
-
@AnthonyPegram 我认为引用类型的大多数用法都是隐式非空的,因此通过方法签名强制执行在文档和安全方面是一个胜利。
-
@AakashM 谢谢,我使用 ReSharper,但尚未调查其无效性检查。会调查的!
-
嗨 Akash,正如您在我的更新中看到的那样,我完全同意 Ani 的观点,即默认构造函数破解是不可行的。您在“这似乎是一个很好的方法”这个问题中自己说,但这并不是因为 Ani 在他的回答中提到的限制,我也同意这些案例并不“罕见”。但是,我同意您的观点,运行时空值检查有点太晚了,但除了更改语言/库/ide 之外,我看不到任何支持设计/构建时间检查的方法...... Aka。代码合同。但遗憾的是,这个功能只出现在昂贵的 vs 版本中。
标签: .net non-nullable