Определение свойств класса - PullRequest
1 голос
/ 25 июня 2010

может кто-нибудь сказать мне разницу между

public class Vendor
{
    public string VendorName { get; set; }
}

и

public class Vendor
{
    private string vendorName = string.Empty; 

    public string VendorName
    {
        get { return vendorName; }
        set { vendorName = value; }
    }
}

Есть ли польза от использования закрытой переменной? Это только пустая трата времени и строк? В классе нет никаких манипуляций со свойством.

Спасибо

Ответы [ 4 ]

5 голосов
/ 25 июня 2010

Если это все, что вы делаете, IMO не принесет никакой пользы.

Существенная разница между этими блоками кода заключается в том, что первый по умолчанию равен нулю, а второй по умолчанию - строке.*

Кроме этого, я бы каждый раз выбирал свойства авто (опция 1).Это то, что было добавлено в C # 3.0.

2 голосов
/ 25 июня 2010

C # 3 представил автоматически реализованные свойства, которые делают возможным ваш первый фрагмент.Компилятор создаст для вас ваше вспомогательное поле, которое сделает скомпилированный код эквивалентным скомпилированному коду вашего второго фрагмента.Если вы работаете в базе кода <= 2.0, вы будете использовать второй фрагмент. </p>

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

2 голосов
/ 25 июня 2010

Отсутствует. Я обнаружил, что авто-свойства довольно хорошо очищают код; особенно в классах с большими свойствами.

EDIT

Следует помнить, что если вы используете значение для указания нулей (т.е. при сохранении в БД; если DateTime равно DateTime.MinValue, сохраните NULL в базе данных), вам необходимо объявить в конструкторе.

Пример примера

вместо

public class Vendor
{
    private DateTime deletedDate = DateTime.MinValue; 

    public DateTime DeletedDate
    {
        get { return deletedDate ; }
        set { deletedDate = value; }
    }
}

вам нужно что-то вроде этого:

public class Vendor
{
    public DateTime DeletedDate { get; set; }

    public Vendor()
    {
        DeletedDate = DateTime.MinValue;
    }
}
1 голос
/ 25 июня 2010

Учитывая ваши образцы, они семантически одинаковы (кроме начального значения null для первого и string.Empty для второго и того факта, что переменная поддержки не видна вашему классу в авто версия свойства). Таким образом, нет, нет особого преимущества использования полностью объявленного свойства, кроме возможности установить начальное значение в объявлении (как вы делаете в примере).

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

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