【问题标题】:How to avoid stack overflow errors when defining set accessor in C#在 C# 中定义 set 访问器时如何避免堆栈溢出错误
【发布时间】:2013-11-25 16:11:02
【问题描述】:

stackoverflow 的人。我是 c# 新手,这是我第一次无法找到我的一个基本问题的答案。谁能帮帮我?!我正在尝试为公共实例字段定义集合逻辑。

运行完美,

公共字符串标题{get;设置;}

这会导致堆栈溢出

公共字符串标题
{ 得到 { 返回标题; } 放 { 标题=价值; } }

【问题讨论】:

  • 为什么需要setter?人们在这里做的通常的事情是定义一个私有变量并在 setter 中使用它,并在 getter 中读取它。但是,您似乎在这里不需要它,只需使用您已经拥有的自动实现的属性即可。
  • 您的属性设置器正在调用属性设置器。如果您在调试器中逐步执行此操作,那么发生的事情会更加明显。

标签: c# get set stack-overflow


【解决方案1】:

您正在递归调用 getter 和 setter(无限调用自身),不可避免地导致堆栈溢出。

这就是你的意思:

private string headline;
public string Headline
{
    get { return headline; }
    set { headline = value; }
}

请注意,如果您不打算引入任何进一步的 get/set 逻辑,则这是不必要的,因为这正是您的第一个示例在幕后所做的。

在学习 c# 中的属性时,最好不要将它们视为数据,而是将其视为具有以下签名的一对方法:

public string get_Headline() { ... }
public void set_Headline(string value) { ... }

事实上,这正是编译器定义它们的方式。

现在很容易看出您的初始代码会递归调用set_Headline

【讨论】:

    【解决方案2】:

    如果您尝试将setget 用于您的属性,则需要一个支持字段。

    private string _headline; //backing field.
    
    public string Headline
    {
        get { return _headline; }
        set { _headline = value; }
    } 
    

    在您当前的代码中,您尝试递归设置属性,从而导致 stackoverflow 异常

    【讨论】:

      【解决方案3】:

      因为你递归地返回相同的东西。

      private string _headLine
      
      public string Headline
      { 
         get 
         { return _headline; } 
         set 
         { _headline = value; } 
      }
      

      【讨论】:

        【解决方案4】:

        在这种情况下,而不是像其他答案所说的那样生成一个新变量。你可以简单地写。

        public string Headline { get; set;}
        

        这将允许任何人检索这个你可以重写的变量

        public string Headline;
        

        如果您希望设置是私密的,您可以说。

        public string Headline { get; private set; }
        

        我更喜欢这种方式,因为这样您不必分配新变量,并且代码的可读性大大提高:)

        【讨论】:

          猜你喜欢
          • 2020-03-08
          • 2010-12-04
          • 2010-11-30
          • 2013-10-29
          • 2012-08-22
          • 2020-08-19
          • 2011-09-21
          • 2014-04-13
          • 2011-11-23
          相关资源
          最近更新 更多