Вопрос

У меня есть простой класс, использующий автоматически реализованные свойства:

Public Class foo
{
    public foo() { }  

    public string BarName {get; set;}
}

Очевидно, что я использую переменную BarName во всем своем классе, и теперь мне нужно добавить логику при установке значения свойства (все это должно быть в верхнем регистре, см. рисунок).Означает ли это , что теперь мне нужно создать закрытую переменную для BarName , например_BarName и изменить текущую переменную BarName, используемую во всем моем классе, на _BarName ?

Public Class foo
{
    public foo() {}  

    private string _BarName = "";
    public string BarName 
    { 
        get {return _BarName;}
        set {_BarName = Value.ToString().ToUpper();}
    }
}

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

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

Это кажется справедливым компромиссом между строками кода для настройки свойств.

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

Решение

Означает ли это, что мне нужно сейчас создать закрытую переменную для BarName

ДА

и измените текущую переменную BarName , используемую во всем моем классе

Не изменяйте остальной код в вашем классе, чтобы использовать новую закрытую переменную, которую вы создаете. Имя бара, как свойство, предназначено для скрытия частной переменной (среди прочего), чтобы избежать радикальных изменений, которые вы планируете внести в остальную часть вашего кода.

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

Правильно.

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

Вам не нужно ничего менять. Автоматически реализованные свойства являются просто синтаксическим сахаром. Компилятор генерирует приватную переменную и логику get / set для вас, за кулисами. Если вы добавите свою собственную логику получения / установки, компилятор будет использовать ваш код вместо автоматически сгенерированного кода, но что касается users этого свойства, ничего не изменилось; любой код, ссылающийся на вашу собственность, продолжит работать.

При использовании автоматических свойств вы не получаете прямого доступа к основному " поддержке " переменная, и вы не получите доступ к реальной логике, которая реализуется в свойствах getter и setter. У вас есть доступ только к свойству (следовательно, вы можете использовать BarName по всему коду).

Если вам теперь нужно реализовать определенную логику в установщике, вы больше не можете использовать автоматические свойства и должны реализовать свойство в «старомодном» стиле. путь. В этом случае вам потребуется реализовать собственную частную резервную переменную (предпочтительным методом, по крайней мере для меня, является присвоение частной резервной переменной того же имени, что и у свойства, но с начальным нижним регистром (в данном случае, резервная копия). переменная будет иметь имя barName). Затем вы реализуете соответствующую логику в методе получения / установки.

В вашем примере вы правы, что это не является серьезным изменением. Этот тип рефакторинга (переход от автоматических свойств к «обычным» свойствам никогда не должен быть серьезным изменением, поскольку вы не изменяете открытый интерфейс (имя или доступность открытого свойства).

Не используйте автоматические свойства, если вы знаете, что собираетесь проверить этот объект. Эти объекты могут быть объектами домена и т. Д. Например, если у вас есть класс Customer, тогда используйте закрытые переменные, потому что вам может потребоваться проверить имя, дату рождения и т. Д. Но если вы используете класс Rss, тогда будет просто использовать автоматические свойства. поскольку проверка не выполняется, а класс просто используется для хранения некоторых данных.

Вы правы в отношении рефакторинга, и он действительно не должен ничего ломать.

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

В вашем простом примере было бы целесообразно оставить достаточно хорошо в покое и убедиться, что никакой внутренний код класса не может подорвать преобразование / форматирование, выполняемое в установщике.

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

Вам нужно будет просмотреть каждое вхождение доступа к авто-свойству в классе и решить, должно ли оно касаться поля или использовать свойство.

Автоматические свойства являются просто синтаксическим сахаром, компилятор фактически создает для него закрытый член, но так как он генерируется во время компиляции, вы не можете получить к нему доступ.

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

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