【问题标题】:Three operator causes StackOverflowException [duplicate]三个运算符导致 StackOverflowException [重复]
【发布时间】:2016-03-22 14:58:16
【问题描述】:

我知道,在这种情况下我可以简单地使用 abs,但我只是好奇:为什么会发生这种情况?

public float maxThrotle{
    set { maxThrotle = value < 0 ? -value : value;    //this line causes problem
    }
    get { return maxThrotle; }
}

【问题讨论】:

  • 您的 setter 分配了 maxThrotle 属性。它运行分配 maxThrotle 属性的设置器。它运行分配 maxThrotle 属性的设置器。它运行分配 maxThrotle 属性的设置器。它运行分配 maxThrotle 属性的设置器。它运行分配 maxThrotle 属性的设置器。它运行分配 maxThrotle 属性的设置器。它运行分配 maxThrotle 属性的设置器。哪个运行分配 maxThrotle 属性的设置器... Kaboom!
  • 您的 getter 读取 maxThrotle 属性。它运行读取 maxThrotle 属性的 getter。它运行读取 maxThrotle 属性的 getter。它运行读取 maxThrotle 属性的 getter。它运行读取 maxThrotle 属性的 getter。它运行读取 maxThrotle 属性的 getter。它运行读取 maxThrotle 属性的 getter。它运行读取 maxThrotle 属性的 getter。它运行读取 maxThrotle 属性的 getter。哪个.. Kaboom!
  • 汉斯你在重复你自己。变老? ;)
  • @garglblarg 或其中一个分支...考虑一下当您不小心将i = 0 传递给int f(int i) { return (i % 2 == 0) ? g(i) : h(i); } 时会发生什么,而g(i) 最终会在某个时候调用f(i)
  • @CompuChip 好点,我应该刚刚提到递归。但仍然不是由运营商造成的。

标签: c# exception operator-keyword


【解决方案1】:

通过尝试从属性设置器中调用属性设置器,您正在导致无限循环。

您可能希望创建一个私有的支持字段来存储该值,如下所示:

private float maxThrotle;
public float MaxThrotle {
    set { maxThrotle = value < 0 ? -value : value;    //this line causes problem
    }
    get { return maxThrotle; }
}

请注意,根据大多数 C# 编码标准,我将属性重命名为使用大写字母。

(另外,throttle这个词用双-t-拼写)。

【讨论】:

  • 啊,太尴尬了!无论如何,谢谢你的回复。我的编程老师告诉我,在最新版本的 c# 中,您不需要实现额外的私有变量......但要么他错了,要么我误解了他。
  • 如果在 getter 和 setter 中不需要特殊的逻辑,你可以写 public float MaxThrottle { get; set; } 相当于 private float _#maxThrottle; public float MaxThrottle { get { return _#maxThrottle; } set { _#maxThrottle = value; } } (编译器生成一个支持字段 _#maxThrottle with an else名称无效,因此您只能通过属性访问它)。但是,如果您实现自定义 getter 和 setter,您还需要实现支持字段。
猜你喜欢
  • 2019-07-14
  • 2011-05-05
  • 2014-09-29
  • 2020-02-06
  • 2019-12-30
  • 2014-10-03
  • 2016-12-16
相关资源
最近更新 更多