System.StackOverflowException,当使用get set属性时?

Mou*_*rya 15 c# asp.net wcf

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; }
    }

}
Run Code Online (Sandbox Code Playgroud)

然后我有类型成员名称的方法如下

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;
    }
Run Code Online (Sandbox Code Playgroud)

我在包含get set属性的类中获取错误.

但是当我像这样修改类时,我能够摆脱错误:

 [DataContract]
public class memberdesignations
{
    [DataMember]
    public string DesigId
    {
        get;  set;
    }
    [DataMember]
    public string DesignationName
    {
        get; set;
    }
}
Run Code Online (Sandbox Code Playgroud)

在搜索论坛时,我找到了原因,并由Konamiman 在这里解释

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

或任何其他解释将不胜感激.

谢谢

Kil*_*ine 39

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

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

public string DesignationName
{
  //Some getter to return some data
  //Some setter to set the data
}
Run Code Online (Sandbox Code Playgroud)

你期望它返回什么?如何返回硬编码的字符串_designationName;

private string _designationName = "someName";
public string DesignationName
{
  get {return _designationName;}
  //Some setter to set the data
}
Run Code Online (Sandbox Code Playgroud)

这样可行.但如果我让它自己返回会发生什么呢?

public string DesignationName
{
  get {return DesignatioName;}
  //Some setter to set the data
}
Run Code Online (Sandbox Code Playgroud)

好吧,它会继续调用DesignationName,它会再次调用自己,这将再次调用DesignationName ......等等.所有这些都将数据放在堆栈上,并一直持续到超出堆栈的已分配空间.瞧,堆栈溢出.

你的上一个例子工作的原因是它使用了所谓的"autoproperty",这是.NET 3.0的一个新功能.基本上,在幕后,它正在为您的属性创建支持字段,以便:

public string DesignationName
{
  get;
  set;
}
Run Code Online (Sandbox Code Playgroud)

实际上编译成这样的行为:

private string _designationName = string.Empty;
public string DesignationName
{
  get { return _designationName; }
  set { _designationName = value; }
}
Run Code Online (Sandbox Code Playgroud)


TGH*_*TGH 6

你在setter中指的是属性本身,所以它将以递归方式调用它自己.(一遍又一遍,直到你的堆栈溢出)

通过使用简短的符号得到; 和set;,你基本上是添加一个隐含的支持字段(如支持变量).这样您就不会触发递归调用,因为您的属性只是支持字段的包装器.


小智 5

声明两者的私有变量:_desigId,_designationName.你处于一个无限循环的递归循环中.返回私有变量,而不是属性.