C#:构造函数中奇怪的ref行为类似于“;虚拟字段”;
本文关键字:类似于 虚拟 字段 ref 构造函数 | 更新日期: 2023-09-27 18:27:16
背景是在NHibernate映射中,因为集合字段在基类中声明,并在运行时动态代理。
由于在我的编码过程中有一些代理类需要引用集合字段,但是,当NHiberate用自己的集合实例重新分配字段时,代理会丢失引用。
尝试使用ref
"跟踪"引用,但失败,结果为weired。
一些专家能用C#ref关键字和NHiberate集合代理(如果有的话)来解释根本原因吗。
谢谢。
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);
}
}
预期输出:A.BB实际输出:A.BA.
尝试使用ref来"跟踪"引用,但失败了,结果是错误的。
这个结果并没有什么奇怪的——你只是对ref
理解不够。ref
只影响其声明的参数。
所以在这条线上:
this.a = a;
您只是将a
参数的当前值复制到a
字段中。构造函数中对参数值的任何后续更改(没有任何更改)都将不会在字段中反映,并且对再次用作参数的变量的任何更改都不会反映在字段中。
因此,更改C
类中的a
字段(如果为字段和参数使用不同的名称,这将非常有帮助)根本不会更改Proxy
实例的a
字段中的值。
请注意,这也与NHibernate无关——这只是标准的C#行为。