Первое поле доступно только для чтения, а второе компилируется как пара методов (и все чтения свойства ProductLocation
компилируются в вызовы соответствующего метода get
и записываются в него. скомпилированы в вызовы метода set
; внутренне эти методы будут считывать / записывать во внутреннее автоматически генерируемое поле, не предназначенное только для чтения). Я бы сказал, что самое важное отличие - безопасность потоков ! (как? читай дальше!)
Основное использование класса будет выглядеть точно одинаково: код в других классах сможет только читать значение, но не изменять его. Кроме того, код для чтения значения будет выглядеть точно так же (например, print(myInstace.ProductLocation)
; здесь вы не можете сказать, как оно было объявлено, круто, а?)
Первое, самое тривиальное отличие состоит в том, что свойство с закрытым установщиком позволяет экземплярам одного класса изменять значение, в то время как в случае свойства только для чтения, даже сам объект не сможет изменить значение.
Теперь для обеспечения безопасности потоков. Атрибут readonly
в поле изменит свою семантику видимости памяти при работе с несколькими потоками (так же, как поля final
Java).
Поле readonly
может быть назначено только при объявлении или в конструкторе. Значение, присвоенное полю readonly
, не может быть изменено (по крайней мере, не нормальным способом), и гарантируется, что каждый поток увидит правильно инициализированное значение после того, как конструктор вернет . Следовательно, поле readonly
по своей природе является поточно-ориентированным.
Для достижения той же безопасности потока с помощью этого свойства вам необходимо добавить некоторую синхронизацию в свой код, которая подвержена ошибкам. Это может привести к взаимным блокировкам, скачкам данных или снижению производительности, в зависимости от ситуации, особенно если у вас нет опыта.
Таким образом, если значение представляет собой нечто, что семантически не может быть изменено после создания объекта, вам не следует объявлять частный установщик (это будет означать, что объект может его изменить). Перейдите к полю только для чтения (и, возможно, объявите его закрытым и объявите открытое свойство, доступ к которому имеет только получатель!) На самом деле это предпочтительная форма, поскольку выставлять поля нехорошо, лучше показывать только методы - там Есть много причин, объясняющих, почему в этот ответ )