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)
你在setter中指的是属性本身,所以它将以递归方式调用它自己.(一遍又一遍,直到你的堆栈溢出)
通过使用简短的符号得到; 和set;,你基本上是添加一个隐含的支持字段(如支持变量).这样您就不会触发递归调用,因为您的属性只是支持字段的包装器.
| 归档时间: |
|
| 查看次数: |
46196 次 |
| 最近记录: |