Должны ли переменные конструктора передаваться напрямую в частные поля или свойства?

StackOverflow https://stackoverflow.com/questions/131517

  •  02-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top