C # Сокращенный вопрос о свойствах - PullRequest
32 голосов
/ 26 марта 2009

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

public Class1 myVar { get; set; }

Для чего стоит Class1 - абстрактный класс.

Ответы [ 7 ]

82 голосов
/ 26 марта 2009

В C # 3.0 и более поздних версиях автоматически реализуемые свойства делают объявление свойства более кратким, когда в средствах доступа к свойствам не требуется дополнительная логика. Они также позволяют клиентскому коду создавать объекты. Когда вы объявляете свойство, как показано в следующем примере, компилятор создает частное анонимное вспомогательное поле, к которому можно получить доступ только через методы доступа get и set свойства.

// Auto-Impl Properties for trivial get and set
    public double TotalPurchases { get; set; }
    public string Name { get; set; }
    public int CustomerID { get; set; }
27 голосов
/ 26 марта 2009

Это синтаксис, позволяющий компилятору создать (скрытое) поле для вас.

Также очень полезно:

public Class1 myVar{ get; private set; }
22 голосов
/ 26 марта 2009

Может выглядеть как абстрактное свойство или свойство интерфейса, но оно далеко от него. Чтобы побудить разработчиков использовать свойства (так как они по многим причинам являются лучшими практиками) Microsoft решила включить эту функцию в C # 3, чтобы позволить вам с большей легкостью объявлять свойства.

Вот стандартный способ создания свойства:

String foo;

public String Foo
{
    get { return this.foo }
    set { this.foo = value; }
}

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

Теперь с помощью компилятора C # 3 мы можем сделать это:

public String Foo { get; set; }

Хотя это выглядит немного странно, рассмотрим работу, которую компилятор выполняет от вашего имени. Предыдущий код компилируется в это:

[CompilerGenerated]    
private string <Foo>k__BackingField;

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

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

7 голосов
/ 26 марта 2009

Это сокращение для свойства, которое не делает ничего, кроме сохранения значения в поле. Так что это будет эквивалентно:

private Class1 _myVar;

public Class1 myVar
{
  get{ return _myVar; }
  set{ _myVar = value;}
}

Это просто простое свойство, которое можно заменить yoy на более сложное, без изменения интерфейса.

7 голосов
/ 26 марта 2009

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

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

2 голосов
/ 26 марта 2009

Это автоматически реализованные свойства. Они позволяют сделать ваш код более лаконичным. Подробнее о них можно прочитать здесь:

Auto-Реализовать

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

public int MyVar {get; приватный набор; }

Это позволяет вам выставить свойство вне класса и при этом установить его внутри.

0 голосов
/ 26 марта 2009

Автоматические геттеры и сеттеры.

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