Подтвердить что ты не робот

Автоматические свойства С#

Я немного запутался в точке Автоматические свойства в С#, например,

public string Forename{ get; set; }

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

public string Forename; 

Я не уверен, какая разница между этими двумя утверждениями, я всегда думал, что вы использовали свойства, если вам нужна дополнительная логика get/set?

4b9b3361

Ответ 1

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

Ответ 2

Вы можете написать

public string Forename{ get; private set; }

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

Ответ 3

Я не уверен, какая разница между этими двумя утверждениями, я всегда думал, что вы использовали свойства, если вам нужна дополнительная логика get/set?

В первом случае компилятор автоматически добавит вам поле и обернет его. Это в основном эквивалентно:

private string forename;
public string Forename
{
    get
    { 
        return this.forename;
    }
    set
    {
        this.forename = value;
    }
}

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

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

Ответ 4

Это означает, что вы ожидаете добавить логику позже.

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

Ответ 6

Члены публичных данных являются злыми (в том, что объект не контролирует модификацию его собственного состояния - он становится глобальной переменной). Прерывает инкапсуляцию - принцип ООП.

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

public string ID { get; set;}

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

string m_ID;
public string ID
{
   get { return m_ID; }
   set 
   { 
     //validate value conforms to a certain pattern via a regex match
     m_ID = value;
   }
}

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

Ответ 7

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

Ответ 8

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

Если вы перешли от общедоступной переменной к свойству, это будет изменением для других библиотек, которые ссылаются на вас - следовательно, почему бы не начать с свойства auto?:)

Ответ 9

Не все свойства должны получить/установить логику. Если это так, вы используете закрытую переменную. Например, в шаблоне MV-something у вашей модели не будет много логики. Но вы можете смешивать и сопоставлять по мере необходимости.

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

Ответ 10

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

Необходимость в свойствах на С#

Порты в С#, только чтение, запись только, чтение/запись, автоматическое выполнение

Ответ 11

Взгляните на следующий код и объяснение.
The most common implementation for a property is getter or a setter that simply reads and writes to a private field of the same type as a property. An automatic property declaration instructs the compiler to provide this implementation. The compiler automatically generates a private backing field.
Посмотрите на следующий код: -

    public class Stock 
    {
      decimal currentPrice ;  // private backing field.
      public decimal CurrentPrice 
      {
        get { return currentPrice ; }
        set { currentPrice = value ; }
      }
   }

Тот же код можно переписать как: -

   public class Stock
   {
     public decimal CurrentPrice { get ; set ; } // The compiler will auto generate a backing field.
   }

ИСТОЧНИК: - С# в двух словах