C#, разница между свойством с переменной и без переменной

Возможный дубликат:
В чем разница между инкапсуляцией закрытого члена как свойства и определением свойства без закрытого члена?

Я знаю основные функции свойств. Но когда я подробно изучаю документацию, я вижу, что они объявляются только с помощью get set и без переменных.

какая разница между этими двумя

public int EmpCode
{
    get { return _strEmpCode; }
    set { _strEmpCode = value; }
}  

и

public int EmpCode
{
    get; 
    set; 
}  

Это просто более простой способ написания, который появился после обновления фреймворков .net. Или есть какая-то функциональная разница?


person Kuntady Nithesh    schedule 06.09.2011    source источник


Ответы (6)


Последнее называется автоматическим свойством и является тем же самым. Они были введены в C # 3, вы можете прочитать о них больше здесь: http://trashvin.blogspot.com/2008/05/automatic-properties-and-object.html

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

person Paul    schedule 06.09.2011
comment
Является ли это сокращением применимым ко всем типам данных? - person Kuntady Nithesh; 06.09.2011
comment
@Nithesh Hebri - Это действительно так. - person Øyvind Bråthen; 06.09.2011
comment
Он включен в .net framework 3.5? - person Kuntady Nithesh; 06.09.2011
comment
@Nithesh Hebri - Да, .NET 3.5 работает под управлением С# 3.0 - person Paul; 07.09.2011

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

Раздел 10.7.3 спецификации C# содержит более подробную информацию:

Когда свойство указано как автоматически реализуемое свойство, для свойства автоматически становится доступным скрытое резервное поле, а методы доступа реализуются для чтения и записи в это резервное поле.

Следующий пример:

public class Point {
   public int X { get; set; } // automatically implemented
   public int Y { get; set; } // automatically implemented
}

эквивалентно следующему объявлению:

public class Point {
   private int x;
   private int y;
   public int X { get { return x; } set { x = value; } }
   public int Y { get { return y; } set { y = value; } }
}
person vcsjones    schedule 06.09.2011
comment
нет функциональной разницы, однако, если вы собираетесь сериализовать автоматические свойства, вы получите запутанные имена для резервных полей, что может быть очень раздражающим. - person vittore; 06.09.2011

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

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

person Øyvind Bråthen    schedule 06.09.2011
comment
Является ли это сокращением применимым ко всем типам данных? - person Kuntady Nithesh; 06.09.2011
comment
@Nithesh Hebri - Это действительно так. - person Øyvind Bråthen; 06.09.2011

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

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

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

person vittore    schedule 06.09.2011

Это усовершенствование C # 3.0, которое называется автоматически реализуемыми свойствами, приватное резервное поле автоматически создается компилятором в фоновом режиме.

person V4Vendetta    schedule 06.09.2011

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

    public int EmpCode
    {
        get { return _strEmpCode > 0 ? 100 + _strEmpCode : 0; }
        set
        {
            if (value > 0)
                _strEmpCode = value;
        }
    }

В противном случае вы можете просто использовать версию без закрытых переменных.

person Illuminati    schedule 06.09.2011