在C#堆栈溢出中使用访问器

时间:2011-04-05 03:12:04

标签: c# accessor

来自http://msdn.microsoft.com/en-us/library/aa287786(v=vs.71).aspx

  

public string Name {get {         返回名称; } set {         name = value; }}

那么为什么当我将值设置为:

public int numHighAttacksHit
        {
            get { return numHighAttacksHit - handicapHighAttacks; }
            set { numHighAttacksHit = value; }
        }

this.numHighAttacksHit = 0;

它一直盘旋,再次设置值到numHighAttacksHit,直到我达到堆栈溢出?这属于同一类,重要吗?

屏幕截图:http://gyazo.com/a49757753acfbb5b51aaef5be033c948.png

5 个答案:

答案 0 :(得分:4)

该属性需要引用字段,如下所示:

private int numHighAttacksHit;
public int NumHighAttacksHit   // <-- note the pascal case
    {
        get { return numHighAttacksHit - handicapHighAttacks; }
        set { numHighAttacksHit = value; }
    }

this.NumHighAttacksHit = 0;

答案 1 :(得分:3)

您正在引用其定义中的属性导致堆栈溢出,这与MSDN中的示例不同。

private int numHighAttacksHit;
public int NumHighAttacksHit
{
            get { return numHighAttacksHit - handicapHighAttacks; }
            set { numHighAttacksHit = value; }
}

答案 2 :(得分:3)

C#区分大小写:名称和名称是两个不同的东西,在MSDN文章中,它的名称定义为私有字段:

private string name;   // the name field
public string Name   // the Name property
{
   get 
   {
      return name; 
   }
}

在您的示例中,您没有该私有字段,因此numHighAttacksHit将进入循环访问自身。

答案 3 :(得分:1)

您将在属性numHighAttacksHit内返回属性numHighAttacksHit的值 - 这会创建一个非终止递归,并且是堆栈溢出的来源。

答案 4 :(得分:1)

因为在第二个中,您一次又一次地设置numHighAttacksHit,而在第一个中,您将值设置为name变量而不是属性。