2012-10-06 2 views
3

Я пытаюсь создать свойство i со следующим getter и setter. Я пробовал:C# getter/setter pairs

int i { 
     get{ 
      return i; 
     } 
     set { 
      if (value > 60) { 
      } else { 
       i = value; 
      } 
     } 

    } 

Однако, когда я пытаюсь это, я получаю ошибку переполнения стека при попытке запустить код. Что-то не так с моим кодом? Любой помощник был бы оценен.

ответ

4

ли это:

private int i; // backing field 

int I 
{ 
    get 
    { 
     return i; 
    } 
    set 
    { 
     if (value > 60) { 
     } else 
     { 
      i = value; 
     } 
    } 
} 

Если вы не сделаете этого, ваш код будет храниться в циклическом состоянии и, следовательно, ошибки StackOverflow.

5

Вам нужно поле поддержки, если у вас есть какая-либо логика в вашей собственности (иначе автоматические свойства - это путь) - в настоящее время вы назначаете самому свойству, которое снова вызывает ваш код установщика (аналогично для получателя) - это вызывает исключение Stackoverflow.

Пример:

private int _i; 
public int SomeProperty 
{ 
    get{ return _i;} 
    set 
    { 
    //your logic here 
    _i = value; 
    } 
} 
2

Это его путь

private int i = 0; 
public int I 
{ 
    get 
    { 
     return i; 
    } 
    set 
    { 
     if (value > 60) 
     { 
     } 
     else 
     { 
      i = value; 
     } 
    } 
} 

и выполните некоторые кодирования именования где

  1. Собственность PascalCase как MyProperty
  2. Частные Поля ГорбатыйРегистр как localVariable

для Подробнее читайте here

1

Просто используйте этот кусок кода:

int i; 

public int I 
{ 
    get { return i; } 
    set { if (value <= 60) i = value; } 
} 

Проблема в коде является то, что вы указали я в собственности, который имел в виду себя в теле геттера/сеттера, поворачиваясь циклическим эффектом, и в конечном итоге ошибка StackOverflow.

1
int i { 
    get{ 
     return i; 
    } 
    set { 
     ... 
     i = value; 
     ... 
    } 
} 

В коде, указанном вами выше, вы используете то же имя свойства внутри блоков get и set.

После компиляции ваш код будет переведен на какой-то вещи, эквивалентном это:

int get_i() 
{ 
return get_i(); 
} 

void set_i(int value) 
{ 
set_i(value); 
} 

Как вы можете видеть, каждый из них будет называть себя (рекурсия) бесконечно без каких-либо условий выхода, в результате чего в StackOverflow исключения ,

Если у вас есть поле подкладочного к собственности, как, как и другие ответы на этот вопрос предложили, компилятор будет генерировать некоторые вещи, эквивалентные этот, которое не имеет рекурсии:

int get_i() 
{ 
return _i; //_i is the backing field 
} 

void set_i(int value) 
{ 
_i = value; 
} 

UPDATE:

Для полноты, я добавляю здесь способ решить вашу проблему.

int _i; 
int i { 
    get{ 
     return _i; 
    } 
    set { 
     if (value > 60) { 
     } else { 
      _i = value; 
     } 
    } 
} 
Смежные вопросы