C#:构造函数中奇怪的ref的行为类似于;“虚拟场”;
背景是在NHibernate映射中,因为集合字段在基类中声明,并在运行时动态代理 由于在我的编码过程中有一些代理类需要引用集合字段,但是,当NHiberate使用自己的集合实例重新分配该字段时,代理将丢失引用 尝试使用C#:构造函数中奇怪的ref的行为类似于;“虚拟场”;,c#,nhibernate,constructor,ref,C#,Nhibernate,Constructor,Ref,背景是在NHibernate映射中,因为集合字段在基类中声明,并在运行时动态代理 由于在我的编码过程中有一些代理类需要引用集合字段,但是,当NHiberate使用自己的集合实例重新分配该字段时,代理将丢失引用 尝试使用ref来“跟踪”引用,但失败,结果为weired 一些专家可以用C#ref关键字和NHiberate集合代理(如果有的话)来解释根本原因吗 谢谢 class Program { static void Main(string[] args) { va
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.
B
B
实际产量:
A.
B
A.
尝试使用ref“跟踪”引用,但失败,结果为weired
这个结果没有什么奇怪的-你只是没有充分理解ref
ref
仅影响其声明的参数
所以在这一行:
this.a = a;
您只是将a
参数的当前值复制到a
字段中。以后在构造函数中对参数值的任何更改(不是说有任何更改)都不会反映在字段中,而对再次用作参数的变量的任何更改也不会反映在字段中
因此,在C
类中更改a
字段(如果您对字段和参数使用了不同的名称,这将非常有用)根本不会更改代理实例的a
字段中的值
请注意,这也与NHibernate无关——这只是标准的C#行为。感谢您的见解。假设我在基类中有一个字段,并且我知道某个子类将重新分配它,我如何跟踪该重新分配,以便基类和子类能够确保始终引用同一个对象?
this.a = a;