System.StackOverflowException,当使用get-set-Properties时
本文关键字:get-set-Properties StackOverflowException System | 更新日期: 2023-09-27 18:28:23
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。您处于一个将无限进行的递归循环中。返回私有变量,而不是属性。