【问题标题】:StackOverFlow on class property [duplicate]类属性上的 StackOverFlow [重复]
【发布时间】:2010-10-15 09:51:49
【问题描述】:

复制:

New to C#, why does Property Set throw StackOverflow exception?

我有一个名为 myClass 的简单类,它有一个名为 isAuthenticated 的属性,代码如下:

public class myClass
{
        public myClass()
        {
            this.isAuthenticated = false;
        }
        public bool isAuthenticated
        {
            get { return isAuthenticated; }
            set { isAuthenticated = value; }
        }
}

当我初始化类时,我在 set {...} 行上得到一个 stackoverflow,我做错了什么?

【问题讨论】:

标签: c#


【解决方案1】:

getter/setter 正在调用自己。添加成员变量。

{
     bool isAuthenticated;
        public myClass()
        {
            IsAuthenticated = false;
        }
        public bool IsAuthenticated
        {
            get { return isAuthenticated; }
            set { isAuthenticated = value; }
        }
}

【讨论】:

  • 你的意思是成员变量,不是局部变量。
  • 是的!我自己之前做过这个。有点像编程时嚼口香糖的过程。
【解决方案2】:

因为您正在设置 myClass.IsAuthenticated 属性本身。

您必须将值保存在局部变量中,或者如果您使用 C# 3.0 或更高版本,只需执行(自动属性)

public bool IsAuthenticated {get; set;}

【讨论】:

  • 已编辑以阐明 C# 3.0,而不是 .NET(任何特定)
【解决方案3】:

作为“属性调用本身”注释的补充,在最新的 C# 版本中,您可以将这些给定的简单属性转换为 自动属性:

public class myClass
{
    public myClass()
    {
        this.IsAuthenticated = false;
    }

    public bool IsAuthenticated { get; set; }
}

编辑:更改了属性的大小写,C# 命名约定要求大写字母作为公共字段或属性的起始字母。

【讨论】:

    【解决方案4】:

    蛇吃掉它的尾巴。当您在构造函数中为 isAuthenticated 分配 true 时,您使用属性的设置器,但在设置器中,您再次设置它,因此您有某种无限设置循环。

    【讨论】:

      【解决方案5】:

      当它应该设置一些私有字段时,setter 正在调用自己 - 从外观上看,getter 会做同样的事情,因为您的示例不包含任何字段。如果您使用的是 .net 3.5,则可以只使用自动实现的属性...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-21
        • 1970-01-01
        • 2021-02-03
        • 2013-11-24
        • 1970-01-01
        • 2012-02-10
        相关资源
        最近更新 更多