Использование средств доступа в C # stack overflow

#c# #accessor

#c# #средство доступа

Вопрос:

Из http://msdn.microsoft.com/en-us/library/aa287786 (v = против 71).aspx

Имя общедоступной строки { get { return name; } set { name = value; } }

Итак, почему, когда я устанавливаю значение как so:

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

this.numHighAttacksHit = 0;
  

Он продолжает вращаться снова и снова, устанавливая значение numHighAttacksHit, пока я не достигну переполнения стека? Это относится к тому же классу, имеет ли это значение?

скриншот: http://gyazo.com/a49757753acfbb5b51aaef5be033c948.png

Ответ №1:

Для свойства требуется поле для ссылки, например:

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

this.NumHighAttacksHit = 0;
  

Ответ №2:

Вы ссылаетесь на свойство внутри его определения, вызывающего переполнение стека, в отличие от примера из MSDN.

попробуйте

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

Ответ №3:

C # чувствителен к регистру: Name и name — это две разные вещи, и в статье MSDN имя определено как частное поле:

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

В вашем примере у вас нет этого закрытого поля, поэтому numHighAttacksHit выполняет цикл доступа к самому себе.

Ответ №4:

Вы возвращаете значение свойства numHighAttacksHit внутри самого свойства numHighAttacksHit — это создает непрекращающуюся рекурсию и является источником вашего переполнения стека.

Ответ №5:

Потому что во втором случае вы снова и снова устанавливаете numHighAttacksHit, а в первом вы устанавливаете значение переменной name, а не свойству.