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



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



public string Forename{ get; set; }


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



public string Forename; 


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

478   11  

11 ответов:

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

можно писать

public string Forename{ get; private set; }

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

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

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

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

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

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

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

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

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

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

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;
   }
}

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

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

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

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

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

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

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

нужны свойства В C#

Poperties в C#, только для чтения, только для записи, чтение / запись, автоматическая реализация

взгляните на следующий код и объяснение.
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.
   }

источник:- C# в двух словах

Comments

    Ничего не найдено.