2

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

由于在我的编码过程中有一些代理类需要引用集合字段,但是,由于 NIBerate 使用自己的集合实例重新分配该字段,因此代理会丢失引用。

尝试使用ref“跟踪”参考,但以奇怪的结果失败。

如果有的话,一些专家可以帮助解释 C# ref 关键字和 NIBerate 集合代理的根本原因。

谢谢。

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);
    }
}
预期输出:
一个
乙
乙

实际输出:
一个
乙
一个
4

1 回答 1

5

尝试使用 ref 来“跟踪”引用,但以奇怪的结果失败。

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

所以在这一行:

this.a = a;

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

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

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

于 2013-08-12T11:53:49.643 回答