我知道Java,通常会放入getter / setter方法。我对使用以下代码在C#中执行此操作感兴趣,但是它引发了StackOverflow异常。我在做什么错?

呼叫代码

c.firstName = "a";


属性代码

public String firstName;
{
    get
    {
        return firstName;
    }
    set
    {
        firstName = value;
    }
}


#1 楼

这是因为您要递归调用该属性-在set中,您要再次设置该属性,该属性将无限期地进行下去,直到炸毁堆栈为止。

private string firstName;

public string FirstName
{
    get
    {
        return this.firstName;
    }
    set
    {
        this.firstName = value;
    }
}


或者,如果您使用的是C#3.0,则可以使用自动属性,该属性为您创建一个隐藏的后备字段,例如

public string FirstName { get; set; }


评论


不知道如何调用隐藏的支持字段。感谢yor的自动属性。

–宽带
16年8月22日在12:38



我真不敢相信这是一个解决方案……我对C#的信念现在几乎消失了。

–丹尼尔(Daniel)
18年11月7日在20:24

e,如果您认为这很糟糕,我不希望看到您编写Java。

–卢卡斯·勒布朗(Lucas Leblanc)
19年5月24日在20:48

您能否解释一下,它是如何炸毁堆栈的?在二传手中徘徊着不一样的价值吗?

– Arli Chokoev
2月25日9:51

@ArliChokoev不,请注意大小写:该属性称为FirstName,成员变量称为firstName。为了减少这种混乱,许多开发人员更喜欢为成员加_或m_作为前缀,这样更加明显。

– PMF
5月10日5:58

#2 楼

您正在属性中设置属性名称,而不是字段名称。这样会更好:

private string m_firstName;

public String firstName;
{
    get
    {
        return m_firstName;
    }
    set
    {
        m_firstName = value;
    }
}