c# - System.StackOverflowException ,何时使用 get set 属性?

标签 c# asp.net wcf

在 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; }
    }

}

然后我有如下的 Type memberdesignations 方法

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;
    }

我在包含获取设置属性的类中遇到错误。

但是当我像这样修改类时我能够摆脱错误:

 [DataContract]
public class memberdesignations
{
    [DataMember]
    public string DesigId
    {
        get;  set;
    }
    [DataMember]
    public string DesignationName
    {
        get; set;
    }
}

在搜索论坛时,我找到了原因并由 Konamiman 解释 here

我想知道 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...等等。所有这些都将数据放在堆栈上,并一直持续下去,直到超出为堆栈分配的空间。瞧,stackoverflow。

您的最后一个示例之所以有效,是因为它使用了所谓的“自动属性”,这是 .NET 3.0 的一项新功能。基本上,它在幕后为您的属性创建支持字段,以便:

public string DesignationName
{
  get;
  set;
}

实际上编译后的行为是这样的:

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

关于c# - System.StackOverflowException ,何时使用 get set 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9798697/

相关文章:

c# - 使用 Youtube v3 Api key

asp.net - ServiceReference 一个自托管的 WCF 服务

c# - 如何从 Azure webjob 到 Azure webapp 进行通信?

c# - 如何使关闭按钮像最小化一样工作 : C# Winforms

c# - 有没有办法在 Actions 中选择 Newtonsoft.json 和 System.Text.Json?

c# - 动态创建控件并跨回发保存控件值 - ASP.Net C#

asp.net - 当必填字段验证器为真时调用 Javascript 函数

asp.net - 将 ASP.NET 页面批量移动到新的命名空间?

wcf - 如何使用 ServiceHostFactory 将行为添加到 IIS 托管 WCF 服务中的客户端终结点

javascript - WCF 服务 POST 方法不起作用