#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, а не свойству.