当前位置: 首页 > 编程语言 > C#

System.StackOverflowException,什么时候使用getsetproperties?分享

时间:2023-04-10 19:02:55 C#

System.StackOverflowException使用getset属性时?wcfserviceLibrary.DLL中发生类型为“System.StackOverflowException”的未处理异常。代码如下所示。[DataContract]publicclassmemberdesignations{[DataMember]publicstringDesigId{get{returnDesigId;}set{DesigId=value;}}[DataMember]publicstringDesignationName{get{returnDesignationName;}设置{名称=值;然后我有一个类型成员指定的方法如下publicListmemberdesignations(){Listdesignations=newList();成员名称objmem名称;ds=objbll.Get_Member_Designations();DataViewdv=newDataView();dv=ds.Tables[0].DefaultView;foreach(DataRowViewdrowindv){objmemDesignations=newmemberdesignations();objmemDesignations.DesigId=drow["DesignationId"].ToString();objmemDesignations.DesignationName=drow["DesignationName"].ToString();名称。添加(objmemDesignations);}返回名称;我在包含getset属性的类中遇到错误。但是当我像这样修改类时,我能够摆脱错误:[DataContract]publicclassmemberdesignations{[DataMember]publicstringDesigId{get;放;}[DataMember]publicstringDesignationName{get;放;在搜索论坛时,我找到了原因,Konamiman在这里解释了我想知道Konamiman解释的两种不同方式之间的区别,或者任何其他解释将不胜感激。谢谢问题是,正如Konamiman所说,您正在递归调用属性。假设我有一个字符串属性“DesignationName”。publicstringDesignationName{//Somegettertoreturnsomedata//Somesettertosetthedata}你期望它返回什么?返回硬编码字符串_designationName怎么样?私有字符串_designationName="someName";publicstringDesignationName{get{return_designationName;}//一些setter来设置数据}这行得通。但是如果我让它自己返回会发生什么?publicstringDesignationName{get{returnDesignationName;}//Somesettertosetthedata}好吧,它一直在调用DesignationName,后者再次调用自身,后者再次调用DesignationName......等等。所有这些都将数据放在堆栈上并持续存在,直到超出分配的堆栈空间。瞧,堆栈溢出。您最后一个示例之所以有效,是因为它使用了所谓的“自动属性”,这是.NET3.0的一项新功能。基本上,在幕后,它为您的属性创建支持字段,以便:publicstringDesignationName{get;放;}实际上编译为这样的行为:privatestring_designationName=string.Empty;publicstringDesignationName{get{return_designationName;}设置{_designationName=值;}}为两者声明私有变量:_designId、_designationName。您处于无限循环的递归循环中。返回私有变量,而不是属性。您指的是setter中的属性本身,因此它将递归地调用自身。(一遍又一遍,直到你的堆栈溢出)通过使用短符号get;并设置;,您基本上是在添加一个隐式支持字段(如支持变量)。这样就不会触发递归调用,因为您的属性只是支持字段的包装器。以上就是C#学习教程:System.StackOverflowException,什么时候使用getset属性?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: