2008-10-03 4 views
3

у меня есть простой класс с помощью авто Реализуемой Недвижимости Болгарии Недвижимости:Изучение Auto-Реализовано Свойство

Public Class foo 
{ 
    public foo() { } 

    public string BarName {get; set;} 
} 

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

Public Class foo 
{ 
    public foo() {} 

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

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

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

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

ответ

7

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

Да

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

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

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

Исправить.

+0

А, так я сам использую свойство для доступа к переменной? Не может этого сделать, если он только для чтения. Код, который я имел в виду, что необходимо изменить/in/class – Brettski

+0

В вашем примере это не только для чтения.Однако теперь, когда вы его поднимете, я отвечу, что вы можете сделать собственность общедоступной и конфиденциальной с помощью {get; частный набор; }, который позволит вам написать его изнутри вашего класса. – hurst

6

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

+0

ОК. Но чтобы ввести логику для сеттера и геттера, мне нужно изменить код, как я сделал в моем примере, правильно? – Brettski

+0

Да, все будет хорошо. Вызов ToString() в строке немного избыточен, но это ничего не повредит. –

+0

Что делать, если мне нужно вызвать какой-либо метод при вызове геттера или сеттера? – Brettski

0

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

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

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

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

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

5

При использовании автоматических свойств вы не получаете прямого доступа к основной переменной «backing», и вы не получаете доступ к фактической логике, которая реализуется в свойствах getter и setter. У вас есть доступ к этому свойству (следовательно, с помощью BarName на вашем коде).

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

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

0

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

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

1

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