В чем разница...? [C # свойства GET / SET пути] - PullRequest
4 голосов
/ 24 марта 2011

Я знаю, что в C # вы можете легко создавать средства доступа к типу данных, например, выполняя следующие действия:

public class DCCProbeData
{
    public float _linearActual { get; set; }
    public float _rotaryActual { get; set; }
}

Однако мой коллега посоветовал мне сделать это следующим образом:

public class DCCProbeData
{
    private float _linearActual = 0f;

    public float LinearActual
    {
        get { return _linearActual; }
        set { _linearActual = value; }
    }
    private float _rotaryActual = 0f;

    public float RotaryActual
    {
        get { return _rotaryActual; }
        set { _rotaryActual = value; }
    } 
}

Мой путь кажется более простым и лаконичным.В чем отличия и преимущества этого в любом случае?

Спасибо

Редактировать Просто обратите внимание, что мой коллега смог сгенерировать код для «второго пути»с помощью параметра Refactor на панели «Сведения о классе» легче всего найти файл Diagram.Это позволяет легко добавлять множество свойств без необходимости вручную создавать средства доступа.

Ответы [ 13 ]

24 голосов
/ 24 марта 2011

«Твой путь» просто говорит компилятору создать второй вариант. Если вы не делаете что-либо еще в геттере или сеттере, они функционально идентичны.

Однако, с "вашим путем", я бы порекомендовал использовать правильные соглашения об именах C # Я бы лично написал это как:

public class DccProbeData
{
    public float LinearActual { get; set; }
    public float RotaryActual { get; set; }
}
3 голосов
/ 24 марта 2011

Разница лишь в том, что вы назвали поля.

(хотя я бы придерживался соглашения о присвоении имен вашим публичным объектам.)

1 голос
/ 24 марта 2011

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

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

1 голос
/ 24 марта 2011

Я хотел бы добавить что-то, чего не видел в других ответах, что делает №2 лучшим выбором:

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

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

1 голос
/ 24 марта 2011

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

1 голос
/ 24 марта 2011
1 голос
/ 24 марта 2011

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

0 голосов
/ 24 марта 2011

То, что вы можете сделать, если не используете автоматически реализованные свойства:

  • установить значение по умолчанию
  • доступ или аннотирование вспомогательного поля (атрибуты)
  • Поля поддержки только для чтения или неизменность
  • установить точку останова при доступе
  • имеет собственный код для доступа к переменной
  • Используйте [System.ComponentModel.EditorBrowsableAttribute()], чтобы включить настраиваемую логику для методов доступа, которые вы избегаете случайного обхода при кодировании
    • скрывает фоновое поле от intellisense

Преобразование между этими двумя способами стало очень простым с помощью ReSharper.

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

0 голосов
/ 24 марта 2011

Они одинаковы в том смысле, что ваш пример кода автоматически сгенерирует вспомогательные поля.

Но два примера кода различны, поскольку имена свойств не совпадают (LinearActual против linearActual)

0 голосов
/ 24 марта 2011

Разницы нет , однако до C # 3 вам приходилось использовать длинный путь. В конце концов, это особенность C # - синтаксический сахар . Они оба функционально идентичны.

...