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

wcfserviceLibrary.DLL中发生未处理的“System.StackOverflowException”类型exception

代码如下所示。

[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() { List designations = new List(); 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 在这里解释

我想知道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 ……等等。 所有这些都将数据放在堆栈上,并一直持续到超出堆栈的已分配空间。 Voila,一个堆栈溢出。

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

 public string DesignationName { get; set; } 

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

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

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

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

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