Что такое автоматические свойства в C # и какова их цель? - PullRequest
51 голосов
/ 14 мая 2011

Может ли кто-нибудь дать очень простое объяснение Автоматических свойств в C #, их назначение и, возможно, несколько примеров?Постарайтесь, пожалуйста, придерживаться мнения непрофессионала!

Ответы [ 9 ]

66 голосов
/ 14 мая 2011

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

public int SomeProperty { get; set; }

Они просто синтаксический сахар, поэтому вам не нужно писать следующий более длинный код:

 private int _someField;
 public int SomeProperty 
 {
    get { return _someField;}
    set { _someField = value;}
 }
33 голосов
/ 14 мая 2011

Редактировать: Немного расширив, они используются, чтобы упростить использование частных переменных в классе, но позволяют им быть видимыми вне класса (без возможности их изменения)

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

С обычными свойствами вы можете сделать что-то вроде:

private string example;
public string Example 
{
    get { return example; }
    set { example = value; }
}

Автоматические свойства позволяют создавать что-то действительно лаконичное:

public string Example { get; set; }

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

public string Example { get; private set; }

Это будет эквивалентно:

private string example;
public string Example 
{
    get { return example; }
    private set { example = value; }
}

Или на Java:

private String example;

public String getExample() {
    return example;
}

public void setExample(String value) {
    example = value;
}

Редактировать: @Paya также предупредил меня:

13 голосов
/ 14 мая 2011

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

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

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

Обновление

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

В качестве теста я создалпроект библиотеки и объявил свойство под названием TestData.Я создал целый новый проект только для использования этой библиотеки.Все работало как положено.Затем я изменил свойство на открытое поле (имя осталось прежним) и скопировал новую библиотеку DLL без перекомпиляции потребляющего проекта.В результате возникло исключение, так как код ожидал найти методы свойств методов get_TestData и set_TestData, но поля не доступны через методы.

Unhandled Exception: System.MissingMethodException: Method not found: 'Void TestLibrary.TesterClass.set_TestData(System.String)'.
   at TestLibraryConsumer.Program.Main(String[] args)
3 голосов
/ 14 мая 2011

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

private string _lastName;
public string LastName {
    get {
        return _lastName;
    }
    set {
        _lastName = value;
    }
}  

, вы можете просто набрать:

public string LastName {
    get; set;
} 

и позволить компилятору сгенерировать остальное автоматически.

1 голос
/ 07 сентября 2018

Упрощение принятый ответ, вы можете также использовать :

public int SomeProperty { get; private set; }

Это имеет тот же эффект, и вам больше не нужно создавать другую переменную для этого.

1 голос
/ 14 мая 2011

В более ранних версиях C #, чтобы использовать свойства, вам нужно создать поле для хранения значения (называемое Резервным хранилищем):

private string _something;
public string Prop { get { return _something; } }

Начиная с C # 3.0, это требованиебольше не требуется, и компилятор автоматически создаст для вас резервное хранилище, поэтому нет необходимости объявлять поле _something.

Подробнее об этом можно прочитать здесь: http://msdn.microsoft.com/en-us/library/bb384054.aspx

Надеюсь, это поможет.

1 голос
/ 14 мая 2011

С Автоматически реализуемые свойства (Руководство по программированию в C #) :

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

class Person
{
       public string Name { get; set; }
}
0 голосов
/ 28 мая 2019

Используйте ниже код:

using System;

class My Class
{
    public string Dummy { get; set; }

    public My Class()
    {
        Dummy = "I'm dummy property";
    }
}

class Program 
{
    static void Main() 
    {
            var my Class = new My Class();
             Console .Write Line (my Class .Dummy);
    }
}
0 голосов
/ 02 января 2019

Для любых читателей VB.NET это реализовано немного по-другому.Например:

''' <summary>The property is declared and can be initialized.</summary>
Public Property MyProperty As String = "SomeValue"

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

Dim sConcat As String = _MyProperty + _MyProperty
_MyProperty = sConcat

И во внешнем коде:

Dim sMyValue As String = oMyClassObj.MyProperty ' = "SomeValueSomeValue"

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

...