dlr*_*as2 3 .net c# struct circular-reference
我理解为什么结构不能包含导致逻辑内存问题的循环引用,但为什么可空引用不能绕过这个限制呢?例如:
struct Foo
{
Foo? bar;
}
Run Code Online (Sandbox Code Playgroud)
显然这很容易导致堆栈溢出和循环引用,如果不小心,但不bar应该是指向另一个Foo实例的指针,默认为null?或者(更有可能)我不明白在内存中如何排列可空的值类型?
(我的背景知识主要包括来自这个问题和答案的信息.)
不,不完全.可空值类型实际上Nullable<>是值类型作为泛型参数的实例.问号只是一个简写.
Nullable是一个结构,因此是一个值类型.由于它保留了对Foo结构的引用,因此您仍然具有由值类型组成的循环引用.
Nullable<T> 是一个看起来像这样的结构(不包括构造函数等):
public struct Nullable<T> where T : struct
{
private readonly T value;
private readonly bool hasValue;
}
Run Code Online (Sandbox Code Playgroud)
由于这是一个值类型,你Foo最终会看起来像这样:
struct Foo
{
Foo barValue;
bool hasBarValue;
}
Run Code Online (Sandbox Code Playgroud)
现在希望更明显的是这是一个问题:)
Foo? bar 是一个快捷方式
Nullable<Foo> bar;
Run Code Online (Sandbox Code Playgroud)
Nullable<T> 是一个大致如下所示的结构:
public struct Nullable<T> where T : struct
{
private readonly T value;
private readonly bool hasValue;
//..
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下Foo,Nullable<Foo>将持有一个Foo,反过来又持有一个Nullable<Foo>...