gpt4 book ai didi

C#:构造函数中的奇怪引用的行为类似于 "virtual field"

转载 作者:行者123 更新时间:2023-12-02 21:53:20 24 4
gpt4 key购买 nike

背景是在 NHibernate 映射中,集合字段在基类中声明并在运行时动态代理。

由于在我的编码过程中,有一些代理类需要引用集合字段,但是,当 Niberate 使用自己的集合实例重新分配该字段时,代理会丢失引用。

尝试使用ref“跟踪”引用,但失败并出现奇怪的结果。

一些专家可以帮助解释一下 C# ref 关键字和 NLiberate 集合代理(如果有)的根本原因吗?

谢谢。

class Program
{
static void Main(string[] args)
{
var v = new D();
}
}

class A
{
}

class B : A
{
}

class C
{
public A a = new A();
public Proxy p;

public C()
{
p = new Proxy(ref a);
p.Out();
}
}

class D : C
{
public D()
{
a = new B();
Console.WriteLine(a.GetType().Name);
p.Out();
}
}


class Proxy
{
public A a;

public Proxy(ref A a)
{
this.a = a;
}

public void Out()
{
Console.WriteLine(a.GetType().Name);
}
}
Expected output:ABBActual output:ABA

最佳答案

Tried use ref to "track" the reference, but failed with weired outcome.

这个结果没有什么奇怪的 - 你只是没有充分理解 refref 仅影响其声明的参数。

所以在这一行:

this.a = a;

只是a参数的当前值复制到a字段中。稍后对构造函数中参数值的任何更改(并非有任何更改)都将不会反射(reflect)在字段中 - 并且对再次用作参数的变量的任何更改都不会反射(reflect)在字段中反射(reflect)在现场。

因此,更改 C 类中的 a 字段(如果您对字段和参数使用不同的名称,这确实会有帮助)不会改变Proxy 实例的 a 字段中的值。

请注意,这与 NHibernate 无关 - 它只是标准的 C# 行为。

关于C#:构造函数中的奇怪引用的行为类似于 "virtual field",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18186248/

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