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.

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

尝试使用ref来"跟踪"引用,但失败了,结果是错误的。

这个结果并没有什么奇怪的——你只是对ref理解不够。ref只影响其声明的参数。

所以在这条线上:

this.a = a;

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

因此,更改C类中的a字段(如果为字段和参数使用不同的名称,这将非常有帮助)根本不会更改Proxy实例的a字段中的值。

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