gpt4 book ai didi

.net - 是否可以仅使用值类型创建引用循环?

转载 作者:行者123 更新时间:2023-12-04 20:58:07 25 4
gpt4 key购买 nike

作为解释,在 C# 中采用这种值类型:

struct ObjRef
{
public object Value;
public ObjRef(object value) { Value = value; }
}

我可以想象一个对象图,其中有两个这种类型的盒装实例,每个实例都持有对另一个的引用。这就是我所说的只有值类型的引用循环。

我的问题是这样的对象图是否可以在.NET 中构建。从概念上讲,该构造(如果存在)将如下所示:
object left = new ObjRef();
object right = new ObjRef(left);
left.Value = right;

但显然,最后一行不是有效的 C#。制作最后一行:
((ObjRef)left).Value = right;

由于 Actor 拆箱 left 没有达到结果你最终会变异一个副本。因此,至少在直接的 C# 中,看起来构造是不可能的。

有人知道是否可以使用反射、不安全代码、dynamic 来实现构造吗? ,IL代码,或以任何其他方式?或者,任何人都可以证明 CLR 有效地防止了这种引用循环吗?

请注意,我实际上并不想创建这样的对象图。相反,答案可能会影响与对象图一起使用的算法的设计,例如序列化/反序列化格式化程序。

编辑

Brian 建议,确实可以在不拆箱的情况下修 retrofit 箱值,方法是将其转换为接口(interface)类型而不是值类型。所以给定这段代码:
interface IObjRef
{
IObjRef Value { get; set; }
}

struct ObjRef : IObjRef
{
IObjRef value;
public IObjRef Value { get { return value; } set { this.value = value; } }
public ObjRef(IObjRef value) { this.value = value; }
}

那么我描述的引用循环可以这样构造:
IObjRef left = new ObjRef();
IObjRef right = new ObjRef(left);
left.Value = right;

这基本上给我们留下了理由 #72,为什么可变值类型是邪恶的。

最佳答案

这可以通过使用接口(interface)并让值类型实现接口(interface)并相互引用来实现。这允许他们通过装箱值创建循环,因为与接口(interface)引用一起使用的结构将被装箱。

快速 sample

interface ICycle
{
void SetOther(ICycle other);
}

struct Cycle : ICycle
{
ICycle value;
public void SetOther(ICycle other)
{
value = other;
}
}

class Example
{
static void CreateCycle()
{
ICycle left = new Cycle(); // Left is now boxed
ICycle right = new Cycle(); // Right is now boxed
left.SetOther(right);
right.SetOther(left); // Cycle
}
}

我同意布赖恩的问题,但想知道这会给你带来什么好处。

关于.net - 是否可以仅使用值类型创建引用循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3640963/

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