Должны ли переменные конструктора передаваться напрямую в частные поля или свойства? - PullRequest
3 голосов
/ 25 сентября 2008

Теперь это .NET, но я уверен, что принципал должен применяться ко всем языкам ООП, для упрощения я беру .NET в качестве примера:

R # обычно конструктор-конструктор и передача входящей переменной в приватное поле, которые для меня обычно имеют тенденцию передавать его в Property.

Любое мнение о том, как разные и что является лучшим для этого?

Ответы [ 5 ]

5 голосов
/ 25 сентября 2008

Использование свойств разрешено, если они не являются виртуальными / переопределенными. Свойства по сути являются методами, и вы не должны вызывать виртуальные методы из конструктора, потому что соответствующий тип еще не может быть создан. Microsoft перечислила свой собственный набор рекомендаций , просто прокрутите вниз, чтобы увидеть соответствующее руководство и фрагмент кода, иллюстрирующий проблему (они иллюстрируют это с помощью методов, но, как я уже говорил, свойства .NET - это, по сути, специальные методы). ).

3 голосов
/ 25 сентября 2008

Я бы порекомендовал отправить его в собственность, а не прямо в приватное поле, хотя ваша фактическая реализация будет диктовать точные условия. Например, иногда возникают события, когда вы используете свойство, и вы не хотите запускать эти события во время конструктора. Или, возможно, вы хотите обойти логику Property по какой-то другой причине.

3 голосов
/ 25 сентября 2008

Передача параметра через установщик свойств позволяет хранить любой код проверки только в одном месте.

2 голосов
/ 25 сентября 2008

Будьте осторожны, используя Property Setter. В установщике может быть код, который может вызвать неожиданные побочные эффекты.

1 голос
/ 25 сентября 2008

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

Логика преобразования, которую вы применяете к аргументам конструктора или к входным значениям свойств перед установкой внутреннего состояния объекта, может сильно отличаться. В любом случае, если это так, я использовал явный метод преобразования, вызываемый из установщика свойств и из конструктора, вместо прямого связывания конструктора в установщике свойств.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...