Должны ли переменные конструктора передаваться напрямую в частные поля или свойства?
Вопрос
Это .NET, но я уверен, что этот принцип должен применяться ко всем языкам ООП, для упрощения я беру в качестве примера .NET:
R# обычно создает конструктор и передает входящую переменную в частное поле, что для меня имеет тенденцию передавать ее в свойство.
Любое мнение о том, чем они отличаются и какова наилучшая практика для этого?
Решение
Использование свойств допустимо, если они не являются виртуальными/переопределенными.Свойства по сути являются методами, и вам не следует вызывать виртуальные методы из конструктора, поскольку соответствующий тип может еще не быть создан.Microsoft перечислила свои собственные набор руководящих принципов, просто прокрутите вниз, чтобы увидеть соответствующее руководство и фрагмент кода, иллюстрирующий проблему (они иллюстрируют ее с помощью методов, но, как я уже упоминал, свойства .NET по сути являются специальными методами).
Другие советы
Передача параметра через установщик свойств позволяет хранить любой код проверки только в одном месте.
Я бы рекомендовал отправить его в Property, а не непосредственно в частное поле, хотя ваша фактическая реализация будет диктовать точные условия.Например, иногда при использовании свойства возникают события, и вы не хотите запускать эти события во время работы конструктора.Или, возможно, вы хотите обойти логику свойств по какой-то другой причине.
Будьте осторожны при использовании установщика свойств.В установщике может быть код, который может вызвать неожиданные побочные эффекты.
Я манипулирую полями внутри конструктора.Поля действительно представляют внутреннее состояние вашего объекта, и задача конструктора — инициализировать это внутреннее состояние.Свойства предназначены только для целей инкапсуляции и являются частью общедоступного интерфейса к состоянию объекта.
Логика преобразования, которую вы применяете к аргументам конструктора или к входным значениям свойств перед установкой внутреннего состояния объекта, может сильно различаться.В любом случае, если это так, я использовал явный метод преобразования, вызываемый из установщика свойства и из конструктора, вместо прямого связывания конструктора с установщиком свойства.
Если логики вообще нет, я не понимаю, почему вы хотите использовать метод установки свойств внутри конструктора.