System.StackOverflowException,当使用get-set-Properties时



wcfserviceLibrary.DLL 中发生类型为"System.StackOverflowException"的未处理异常

代码如下所示。

[DataContract]
public class memberdesignations
{
    [DataMember]
    public string DesigId
    {
        get { return DesigId; }
        set { DesigId = value;}
    }
    [DataMember]
    public string DesignationName
    {
        get { return DesignationName; }
        set { DesignationName = value; }
    }
}

那么我有如下的类型成员命名方法

public List<memberdesignations> memberdesignations()
    {
        List<memberdesignations> designations = new List<memberdesignations>();
        memberdesignations objmemDesignations;
        ds = objbll.Get_Member_Designations();
        DataView dv = new DataView();
        dv = ds.Tables[0].DefaultView;
        foreach (DataRowView drow in dv)
        {
            objmemDesignations = new memberdesignations();
            objmemDesignations.DesigId = drow["DesignationId"].ToString();
            objmemDesignations.DesignationName = drow["DesignationName"].ToString();
            designations.Add(objmemDesignations);
        }
        return designations;
    }

iam在包含get-set属性的类中得到错误。

但当我这样修改类时,我能够消除错误:

 [DataContract]
public class memberdesignations
{
    [DataMember]
    public string DesigId
    {
        get;  set;
    }
    [DataMember]
    public string DesignationName
    {
        get; set;
    }
}

在搜索论坛时,我发现原因是Konamiman此处

我想知道Konamiman 解释性质的两种不同方法之间的区别

或者任何其它的解释都将被赞赏。

感谢

问题是,正如Konamiman所说,您正在递归地调用一个属性。

假设我有一个字符串属性"DesignationName"。

public string DesignationName
{
  //Some getter to return some data
  //Some setter to set the data
}

你希望它能返回什么?返回一个硬编码字符串_designationName;

private string _designationName = "someName";
public string DesignationName
{
  get {return _designationName;}
  //Some setter to set the data
}

这很管用。但是,如果我让它自己回来,会发生什么呢?

public string DesignationName
{
  get {return DesignatioName;}
  //Some setter to set the data
}

好吧,它会继续调用DesignationName,它会再次调用自己,它会重新调用DesignationName。。。等等。所有这些都将数据放在堆栈上,并一直持续下去,直到它超出了为堆栈分配的空间。沃伊拉,一个堆叠的气流。

上一个例子之所以有效,是因为它使用了所谓的"自动属性",这是.NET 3.0的一个新功能。基本上,在幕后,它为您的属性创建支持字段,以便:

public string DesignationName
{
  get;
  set;
}

实际编译为如下行为:

private string _designationName = string.Empty;
public string DesignationName
{
  get { return _designationName; }
  set { _designationName = value; }
}

您在setter中引用的是属性本身,因此它将递归地调用自己。(一遍又一遍,直到堆栈溢出)

通过使用带有just-get的短音符;并设置;,您基本上是在添加一个隐含的backing字段(比如backing变量)。这样就不会触发递归调用,因为您的属性只是后台字段的包装器。

为以下两者声明私有变量:_desigId和_designationName。您处于一个将无限进行的递归循环中。返回私有变量,而不是属性。

最新更新