C#:构造函数中的奇怪引用表现得像"虚拟字段"

use*_*851 2 c# nhibernate constructor ref

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

由于有一些代理类需要在编码期间引用集合字段,因此,当NHiberate使用自己的集合实例重新分配字段时,代理会丢失引用.

尝试使用ref"跟踪"参考,但未通过结果.

有些专家可以帮助解释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);
    }
}
Run Code Online (Sandbox Code Playgroud)
Expected output:
A
B
B

Actual output:
A
B
A

Jon*_*eet 5

尝试使用ref来"跟踪"引用,但是因为结果不合适而无效.

这个结果并不奇怪 - 你只是不够理解ref.ref只影响它声明的参数.

所以在这一行:

this.a = a;
Run Code Online (Sandbox Code Playgroud)

只是a参数的当前值复制到a字段中.对构造函数中的参数值的任何后续更改(不是有任何更改)都不会反映在该字段中 - 并且对该变量的任何更改(将再次用作参数)将不会反映在该字段中.

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

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