私有初始化变量未初始化

时间:2011-01-18 19:11:01

标签: c# wcf nhibernate

我在继承的部分类上有一个datacontract,如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;

namespace Domain
{
  [DataContract]
  public partial class IdCard : DomainObject<System.Int64>
  {
    private Group _grp;

    [DataMember]
    public virtual Group Grp
    {
        get { return _grp; }
        set { _grp = value; }
    }

    private bool _unproxized = true;
    public override object UnProxy()
    {
        if (this._unproxized)  // this prevents stackoverflow with cyclical references
        {
            this.Grp = (Group)this.Grp.UnProxy();
            this._unproxized = false;
        }

        return this;
    }
  }
}

出于某种原因,_unproxized永远不会设置为true;有什么想法吗?

我知道我可以简单地切换逻辑,但我很好奇为什么成员变量没有被初始化。

4 个答案:

答案 0 :(得分:4)

您正在查看的实例是否已反序列化?在标准DataContract反序列化期间,不会调用构造函数,只会分配DataMembers。您正在查看的变量未标记为DataMember。

thread使用几乎相同的示例描述了您所看到的行为的实现。

答案 1 :(得分:2)

这是因为在反序列化时,DataContract serialiser使用一种反射来创建完全未初始化的对象实例,然后应用数据。这就是DataContract serialiser不需要无参数构造函数的原因。 (即使你添加一个,它也不会被调用)。如果您使用_unproxied属性标记[DataMember]字段,则为真。

答案 2 :(得分:0)

我怀疑您使用的是网络/服务参考。在这种情况下,代码(私有变量)永远不会到达客户端。

答案 3 :(得分:0)

尝试在构造函数中分配变量,如下所示:

public IdCard()
{
    _unproxized = true;
}