gpt4 book ai didi

.net - 不可为空的引用类型(再次)

转载 作者:行者123 更新时间:2023-12-04 00:24:09 26 4
gpt4 key购买 nike

关于 .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
}
}

在我进一步调查之前,我想问一下是否有人知道这可能导致任何问题?我已经想不出来了。

最佳答案

这可以很容易地被击败 - 运行时不会尝试在每个场景中调用结构的无参数构造函数(如果存在)。

特别是,在创建结构类型的数组时不会调用它。

Age[] ages = new Age[3];

// This guy skips your "real" ctor as well as the "invalid" parameterless one.
Age age = ages[0];

...或在 default(structType)表达式:
// Invalid state here too.
Age age = default(Age);

来自 Jon Skeet 的 empirical research进入这个东西,这里有一个不调用构造函数的其他操作列表:

  • Just declaring a variable, whether local, static or instance
  • Boxing
  • Using default(T) in a generic method
  • Using new T() in a generic method


现在让您陷入困境的情况是您必须以某种方式测试每个 Age实例是否是通过在围栏周围工作而创建的 - 这并不比首先没有竖立围栏好多少。

关于.net - 不可为空的引用类型(再次),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7713159/

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