【问题标题】:C#: weird ref in constructor to behave like "virtual field"C#:构造函数中的怪异 ref 表现得像“虚拟字段”
【发布时间】:2013-08-12 11:50:47
【问题描述】:

背景是在 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);
    }
}
预期输出: 一种 乙 乙 实际输出: 一种 乙 一种

【问题讨论】:

    标签: c# nhibernate constructor ref


    【解决方案1】:

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

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

    所以在这一行:

    this.a = a;
    

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

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

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

    【讨论】:

    • 感谢您的洞察力。假设我在基类中有一个字段并且我知道某个子类会重新分配它,我如何跟踪该重新分配以便基类和子类可以确保始终引用同一个对象?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    • 2015-11-02
    相关资源
    最近更新 更多