C#:构造函数中奇怪的ref的行为类似于;“虚拟场”;

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

背景是在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. B B 实际产量: A. B A. 尝试使用ref“跟踪”引用,但失败,结果为weired

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

所以在这一行:

this.a = a;
您只是将
a
参数的当前值复制到
a
字段中。以后在构造函数中对参数值的任何更改(不是说有任何更改)都不会反映在字段中,而对再次用作参数的变量的任何更改也不会反映在字段中

因此,在
C
类中更改
a
字段(如果您对字段和参数使用了不同的名称,这将非常有用)根本不会更改
代理
实例的
a
字段中的值


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

感谢您的见解。假设我在基类中有一个字段,并且我知道某个子类将重新分配它,我如何跟踪该重新分配,以便基类和子类能够确保始终引用同一个对象?
this.a = a;