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
尝试使用ref来"跟踪"引用,但是因为结果不合适而无效.
这个结果并不奇怪 - 你只是不够理解ref.ref只影响它声明的参数.
所以在这一行:
this.a = a;
Run Code Online (Sandbox Code Playgroud)
你只是将a参数的当前值复制到a字段中.对构造函数中的参数值的任何后续更改(不是有任何更改)都不会反映在该字段中 - 并且对该变量的任何更改(将再次用作参数)将不会反映在该字段中.
因此,更改类中的a字段C(如果您对字段和参数使用不同的名称,它确实会有所帮助)根本不会更改Proxy实例a字段中的值.
请注意,这与NHibernate无关 - 它只是标准的C#行为.
| 归档时间: |
|
| 查看次数: |
121 次 |
| 最近记录: |