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;
}
我在包含get set属性的类中收到错误。
但是当我像这样修改类时,我能够摆脱错误:
[DataContract]
public class memberdesignations
{
[DataMember]
public string DesigId
{
get; set;
}
[DataMember]
public string DesignationName
{
get; set;
}
}
在搜索论坛时,我找到了原因并由Konamiman解释 here
我想知道Konamiman解释的属性的两种不同方式之间的区别
或任何其他解释将不胜感激。
由于
答案 0 :(得分:37)
问题是,正如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 ......等等。所有这些都将数据放在堆栈上,并一直持续到超出堆栈的已分配空间。 Voila,一个堆栈溢出。
您的上一个示例的工作原因是因为它使用的是所谓的“autoproperty”,这是.NET 3.0的一项新功能。基本上,在幕后,它正在为您的属性创建支持字段,以便:
public string DesignationName
{
get;
set;
}
实际编译成这样:
private string _designationName = string.Empty;
public string DesignationName
{
get { return _designationName; }
set { _designationName = value; }
}
答案 1 :(得分:6)
你指的是setter中的属性本身,所以它会递归地调用它自己。(一遍又一遍,直到你的堆栈溢出)
通过使用简短的符号得到;和set;,你基本上是添加一个隐含的支持字段(如支持变量)。这样您就不会触发递归调用,因为您的属性只是支持字段的包装。
答案 2 :(得分:5)
为两者声明私有变量:_desigId,_designationName。你处于一个无限循环的递归循环中。返回私有变量,而不是属性。