Задать вопрос

В чем смысл public _ {get;set} в c#?

Извиняюсь за возможно глупый вопрос, я не так давно начал учится программировать и я даже просмотрев кучу видосов и тем на реддите так и не могу понять зачем все говорят использовать штуки по типу public int {get;set} вместо public int. Я понимаю, что если мы задаем свойствам доп условия, то это может быть использовано для того, чтобы регулировать возможные значения и, к примеру, не сделать этот int отрицательным, если это не предусмотрено, но вот смысл автоматических свойств я так и не могу осознать, хоть убейте. Ей же по сути так и так можно задавать любые значения и получать откуда хочешь, или нет?
  • Вопрос задан
  • 899 просмотров
Подписаться 4 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 4
Потому что так исторически сложилось.
1. Очень многие механизмы раньше (а какие-то и сейчас) работают только со свойствами, но не с полями.
А если они и умеют работать с полями - часто по-умолчанию они с полями не работают.

2. Даже если ты делаешь автосвойство - ты всё равно можешь делать с ним всё то же самое, что и с обычным свойством: вынести его в интерфейс, сделать виртуальным и переопределить в наследниках, а потом обратиться к нему не на конкретном типе, а на интерфейсе. Это может быть очень полезно, а иногда и необходимо в некоторых случаях

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

По сути всё.
Сказки про инкапсуляцию оставим для учебников, так как если мы делаем какую-то тупую DTO-шку, то никакой пользы от обращения через свойства мы не получим.

Накладных расходов у свойств по сути нет, так как JIT их заинлайнит.
А раз никаких минусов нет - зачем включать мозг и думать "а понадобится ли мне по какой-то причине тут свойство или можно обойтись полем"? А потом ещё огребать, если ошибся (даже если это редкий случай)
Единообразие тут скорее благо.

к примеру, не сделать этот int отрицательным

На самом деле это очень редкий кейс.
Зачем делать какую-то валидацию, если можно изначально использовать тип, который не допускает отрицательных значений?

но вот смысл автоматических свойств я так и не могу осознать, хоть убейте

Смысл автосвойств - чтобы не писать руками { get {return x;} set {x = value;}}.
А смысл свойств вообще - чтобы можно было вынести в интерфейс, переопределить, итд.

А ещё у свойства я могу не писать set или вместо set написать init и required, чего я не смогу сделать в классе с полями.
Да, у поля можно написать readonly и получить по сути то же самое, но тогда его надо будет обязательно через конструктор инициализировать.
Ответ написан
Комментировать
VoidVolker
@VoidVolker Куратор тега C#
Dark side eye. А у нас печеньки! А у вас?
Есть поля и есть свойства. Доступ к свойству осуществляется через методы - получения, записи, добавления или вычитания свойства. У полей нет отдельных методов доступа - используется только стандартный механизм доступа. RTFM:
classes and structs -> fields
classes and structs -> properties
Ответ написан
Комментировать
mayton2019
@mayton2019
Bigdata Engineer
Ей же по сути так и так можно задавать любые значения и получать откуда хочешь, или нет?

Это придумали теоретики ООП много лет назад. Идея была в том чтобы не иметь возможности
влиять на приватные поля напрямую
. Например поле может поменять тип в следующей версии софта
или может появится связное поле которое отражает данное. Чтоб эта логика работала геттер и сеттер
могут содержать какие-то действия. Проверки. Или воздействия на другие переменные объекта.

Это называется "инкапсуляция". Тоесть оболочка объекта это не просто бюрократизм а это капсула
которая запрещает неправильные или неконсистентные действия с внутренними полями объекта.

Грубо говоря такой объект это не просто тупой struct/tuple а это некий умный конечный автомат который
имеет более сложное поведение.
Ответ написан
Комментировать
Timur2342
@Timur2342
Чтобы можно было быстрее изменять getter и setter-ы в будущем, других причин думаю нету
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы