【问题标题】:Returning value of static property from public instance property从公共实例属性返回静态属性的值
【发布时间】:2010-04-18 19:02:20
【问题描述】:

我只是在 LINQPad 中玩弄一些代码,并设法使程序因 stackoverflow 异常而崩溃。

我基本上在一个字段中创建了一个静态属性,并使用一个属性从实例返回值。

我的实例属性的 getter 会返回静态字段的值,但 setter 会自行设置。什么时候会使用这种类型的模式,它是如何产生 stackoverflow 异常的?

我所做的代码示例:

void Main()
{
    SomeClass myinstance = new SomeClass();
    SomeClass.x = "Some Value";
    myinstance.y = "Some other value";
    myinstance.y.Dump();
}

public class SomeClass
{
    public static string x;

    public string y
    {
        get { return x; }
        set { y = value; }
    }
}

【问题讨论】:

    标签: c#


    【解决方案1】:

    这是我对属性所做的第一件事 :) -- 您递归地调用 y 设置器而不是设置支持字段。由于它调用自己,它最终会stackoverflow。

    每个 setter 都是语法糖,基本上是一个方法调用。你所做的基本上相当于用一个方法来做这个:

    public class SomeClass
    {
       public string GetValue() { return "some string"; }
       public void SetValue(string arg)
       { 
           SetValue(arg); // recursively calls itself until stackoverflow
       }
    }
    

    【讨论】:

    • 哦,是的!谢谢马克。多么菜鸟的错误:P
    • 简单易做...我相信很多人都做过这个:)
    【解决方案2】:

    您在 setter 中写了 y = value; 而不是 x = value;

    注意,您可以使用简单的属性

    public string y { get; set; }
    

    这会自动生成一个隐藏字段。

    【讨论】:

    • 谢谢丹维尔。我没有为此使用自动属性,因为我正在测试当您从非静态属性返回静态字段的值时会发生什么。 :)
    • 我明白了,所以我的答案在某种程度上被误导了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    相关资源
    最近更新 更多