В чем разница между свойством и переменной


У меня есть путаница в понимании свойств и переменных

public class ABC()
{
    public int A;
    public int B { get; set; }
}

какова точная разница между A и B?

7 57
c#

7 ответов:

как многие отмечали, A-это a поле, б -свойства.

реальный вопрос, почему вы должны заботиться, и что использовать?

Я имею в виду сообщение в блоге Джонатана Анея:

(его в VB, но это относится и к C#;))

Так зачем использовать свойства поля, 5 причин:

1. Поля не могут использоваться в интерфейсах

вы не можете обеспечить существование из поле в публичном контракте объекта через интерфейс. Для свойств хотя он прекрасно работает.

2. Проверка

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

3. Двоичная Сериализация

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

4. Большая часть инфраструктуры привязки данных .NET привязывается к свойствам, но не к полям

Я слышал аргументы с обеих сторон, как ли это хорошо, но реальность такова, что это так работает прямо сейчас. (Примечание от меня: привязки WPF работают над свойствами)

5. Разоблачение публичного поля-это нарушение FxCop

по многим из перечисленных выше причин :)

там может быть больше причин.

Я также хотел бы указать на сообщение в блоге Джеффа Этвуда и заканчиваю цитатой из него:

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

A-поле, B-свойство. Свойство в основном синтаксический сахар для геттеров и сеттеров. Класс, который вы определили, будет скомпилирован в нечто вроде этого:

public class ABC()
{
    public int A;

    private int backing_B;

    public void set_B(int value)
    {
        backing_B = value;
    }

    public int get_B()
    {
        return backing_B;
    }
}

обратите внимание, что этот вид преобразования верен для всех свойств C# -- доступ к ABC.B будет преобразован в вызовы методов. Свойства в основном обеспечивают иллюзию "переменной", в то время как на самом деле это просто умно замаскированная пара методов.

это важно, потому что позволяет объявить ваш собственные GET и set метод, который может проверить значения или делать другие интересные вещи:

private int b;

public int B {
    get { return b; }
    set {
        if (value < 0) throw new ArgumentOutOfRangeException("value");
        b = value;
    }
}

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

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

переменная-это переменная.

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

от MSDN:

заявление собственность представляет декларации в собственность. Свойство может иметь процедуру Get (только для чтения), процедуру Set (только для записи) или обе (чтение-запись). Вы можете опустить процедуру Get и Set при использовании автоматически реализуемого свойства. Дополнительные сведения см. В разделе автоматически реализованные свойства (Visual Basic).

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

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

в C# любая "переменная", которая имеет геттер и сеттер, называется свойством. Переменная не имеет геттеров и сеттеров или так это то, что говорят учебники.

мой инструктор по программированию заставил нас иметь геттеры и сеттеры почти для каждой переменной, которую мы создали в Java. Даже индексируя переменные, он заставил нас использовать геттер и сеттер, если они были объявлены в области глобального класса. Я думаю, что это могло бы быть излишним, но это заставило меня сделать геттеры и инкубационные шкафы.

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

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

private int myVariable;
public int myVariable 
{
    get 
    { 
       return myVariable; 
    }
    set 
    {
        if (value < 0) 
        { 
           throw new Exception("This is your exception some where else in code");
        }
        myVariable = value; //remember value is something that is
                            //declared automatically
    }
}

public string FirstName { get; set; }

выше приведен сокращенный способ написания следующего

private string firstName;

public string FirstName
{
    get
    {
       //...code here
    }

    set
    {
       //...code here
    }
}
A является открытым полем в классе ABC и B является публичным свойством класса ABC. В частности, B - это автоматически реализуемое свойство. Это означает, что" под капотом " компилятор выполняет часть работы за вас и эффективно преобразует ваш код в:
public class ABC()
{
   private int b;

   public int A;
   public int B
   {
       get
       {
          return b;
       }
       set
       {
          b = value;
       }
   }
}

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

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

преимущества свойств состоит в том, чтобы получить или установить значение в частной переменной класса.