2016-03-22 4 views
-2

Я знаю, я мог бы просто использовать абс в этом случае, но мне просто интересно: почему это происходит?Три оператора вызывает StackOverflowException

public float maxThrotle{ 
    set { maxThrotle = value < 0 ? -value : value; //this line causes problem 
    } 
    get { return maxThrotle; } 
} 
+5

Ваш сеттер назначает свойство maxThrotle. Запустится ваш сеттер, который назначает свойство maxThrotle. Запустится ваш сеттер, который назначает свойство maxThrotle. Запустится ваш сеттер, который назначает свойство maxThrotle. Запустится ваш сеттер, который назначает свойство maxThrotle. Запустится ваш сеттер, который назначает свойство maxThrotle. Запустится ваш сеттер, который назначает свойство maxThrotle. Запустится ваш сеттер, который назначает свойство maxThrotle. Что запускает ваш сеттер, который назначает свойство maxThrotle ... Kaboom! –

+4

Ваш геттер читает свойство maxThrotle. Запуск вашего геттера, который считывает свойство maxThrotle. Запуск вашего геттера, который считывает свойство maxThrotle. Запуск вашего геттера, который считывает свойство maxThrotle. Запуск вашего геттера, который считывает свойство maxThrotle. Запуск вашего геттера, который считывает свойство maxThrotle. Запуск вашего геттера, который считывает свойство maxThrotle. Запуск вашего геттера, который считывает свойство maxThrotle. Запуск вашего геттера, который считывает свойство maxThrotle. Какая .. Кабум! –

+2

Вы повторяете себя Ганс. Стареть? ;) –

ответ

2

Вы вызываете бесконечный цикл, пытаясь вызвать средство определения свойств из набора свойств.

Вы, вероятно, хотите, чтобы создать частное поле подложки, чтобы сохранить значение, следующим образом:

private float maxThrotle; 
public float MaxThrotle { 
    set { maxThrotle = value < 0 ? -value : value; //this line causes problem 
    } 
    get { return maxThrotle; } 
} 

Примечание Я переименовал свойство использовать заглавную букву, в соответствии с большинством стандартов # кодирования C.

(Кроме того, слово дроссельная заслонка написано с использованием двойной -t-).

+0

Ах, это так неловко! В любом случае, спасибо за ваш ответ. Мой учитель по программированию сказал мне, что в новейшей версии C# вам не нужно реализовывать дополнительную личную переменную ... но либо он был не прав, либо я неправильно понял его. – user3387666

+0

Если вам не нужна специальная логика в getter и setter, вы можете просто написать 'public float MaxThrottle {get; задавать; } ', что эквивалентно' private float _ # maxThrottle; public float MaxThrottle {get {return _ # maxThrottle; } set {_ # maxThrottle = значение; }} '(компилятор генерирует поле поддержки' _ # maxThrottle' с иным недопустимым именем, поэтому вы не можете получить к нему доступ, кроме как через свойство). Однако, если вы реализуете пользовательский getter и setter, вам также необходимо реализовать фоновое поле. – CompuChip

 Смежные вопросы

  • Нет связанных вопросов^_^