Базовый вопрос свойства C # - PullRequest
2 голосов
/ 23 декабря 2009

В C # свойства должны ссылаться на частные переменные-члены, или я могу просто объявить свойства и использовать их непосредственно в коде класса?

Если первый вариант является лучшим, то исключает ли это использование свойства C # сокращенно? То есть

public string FirstName { get; set; }

Ответы [ 9 ]

27 голосов
/ 23 декабря 2009

Свойства, когда реализованы так:

public string FirstName { get; set; }

Автоматически создайте личную переменную-член (компилятор сделает это за вас), так что вам не нужно об этом беспокоиться. Это будет вести себя точно так же, как если бы вы делали:

private string firstName;
public string FirstName { 
    get { return firstName; }
    set { firstName = value; }
}

Нет причин не использовать автоматические свойства ({get; set;}). Предоставляют те же преимущества, что и создание собственной закрытой переменной-члена.

Кроме того, если позже вы решите, что вам нужно выполнить дополнительную обработку (например, если вы решите внедрить INotifyPropertyChanged в своем установщике свойств), вы можете добавить это, не изменяя ваш общедоступный API, но добавляя поле поддержки вручную.

2 голосов
/ 23 декабря 2009

Свойства, созданные следующим образом

public String Caption{ get; set; } 

это будет скомпилировано как

[CompilerGenerated]
private string <Caption>k__BackingField;

public string Caption
{
    [CompilerGenerated]
    get
    {
        return this.<Caption>k__BackingField;
    }
    [CompilerGenerated]
    set
    {
        this.<Caption>k__BackingField = value;
    }
}

Приведенный выше код извлекается после компиляции с использованием инструмента отражателя.

2 голосов
/ 23 декабря 2009

Вам не нужны свойства для доступа к закрытым полям, но в целом это считается наилучшей практикой.

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

0 голосов
/ 24 декабря 2009

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

0 голосов
/ 23 декабря 2009

если вы используете как

public string FirstName { get; set; }

Компилятор автоматически добавляет методы получения и установки для этого свойства автоматически. Это не плохая практика.

Вот доказательство

alt text

если вы объявите

private string firstName;
        public string FirstName
        {
            get { return firstName; }
            set { firstName = value; }
        }

как и компилятор примет это как

alt text

так что не исключено ...:)

0 голосов
/ 23 декабря 2009

Чтобы добавить ответ Рида, внутри вашего кода (внутри самого класса) функции-члены должны придерживаться этого и фактически использовать свойство, а не фактический закрытый член. Например, если у вас было это:

public string FirstName { get; set; }

И у вас был странный метод с именем public char GetFirstLetter (), который возвращал первую букву имени человека, вы хотели бы сделать это так:

 public char GetFirstLetter()
        {
            return FirstName[0];
        }

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

0 голосов
/ 23 декабря 2009

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

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

0 голосов
/ 23 декабря 2009

C # может ссылаться на частные переменные, как в:

public class A
{
    private string _b;

    public string B
    {
        get { return _b; }
        set { _b = value; }
   }
}

Получить; установить; Обозначение - это автоматические свойства, которые при компиляции сгенерируют для вас приватную переменную, чтобы упростить настройку кода.

0 голосов
/ 23 декабря 2009

Им не нужно ссылаться на закрытые переменные-члены. Вы можете использовать их непосредственно в классе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...