Почему нам нужны свойства в С#

Можете ли вы рассказать мне, какое точное использование свойств в С# я означает практическое объяснение

в нашем проекте мы используем такие свойства, как

/// <summary>
/// column order
/// </summary>
protected int m_order;

/// <summary>
/// Get/Set column order
/// </summary>
public int Order
{
   get { return m_order; }
   set { m_order = value; }
}

/// <summary>
/// constructor
/// </summary>
/// <param name="name">column name</param>
/// <param name="width">column width</param>
/// <param name="order">column order</param>
public ViewColumn(string name, int width, int order)
{
   //
   // TODO: Add constructor logic here
   //
   m_name = name;
   m_width = width;
   m_order = order;
}  


/// <summary>
/// returns the column name, width, and order in list view.
/// </summary>
/// <returns>string represent of the ViewColumn object</returns>
public override string ToString()
{
  return (string.Format("column name = {0}, width = {1}, order = {2}.", 
        m_name, m_width, m_order));
}

/// <summary>
/// Do a comparison of 2 ViewColumn object to see if they're identical.
/// </summary>
/// <param name="vc">ViewColumn object for comparison</param>
/// <returns>True if the objects are identical, False otherwise.</returns>
public override bool Equals(object obj)
{
   ViewColumn vc = (ViewColumn)obj;
   if(m_name == vc.Name &&
        m_width == vc.Width &&
        m_order == vc.Order)
      return true;
   else
      return false;
}

Ответ 1

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

class Room {
   public string sectionOne;
   public string sectionTwo;
}

Room r = new Room();
r.sectionOne = "enter";

Люди вступают в sectionOne довольно легко, не было никакой проверки.

class Room 
{
   private string sectionOne;
   private string sectionTwo;

   public string SectionOne 
   {
      get 
      {
        return sectionOne; 
      }
      set 
      { 
        sectionOne = Check(value); 
      }
   }
}

Room r = new Room();
r.SectionOne = "enter";

теперь вы проверили человека и узнали, есть ли у него что-то злое.

Ответ 2

Короткий ответ: инкапсуляция

Длинный ответ: свойства очень универсальны. Он позволяет вам выбирать, как вы хотите подвергать свои данные внешним объектам. При настройке значений вы можете ввести некоторый объем проверки данных. Он также влияет на головную боль getX() и setX() методов, подобных Java и т.д.

Ответ 3

Множество причин:

  • Семантика. Свойства отделяют реализацию вашего типа от интерфейса.
  • Двоичная совместимость. Если вам когда-либо понадобится изменить свойство, вы можете сделать это, не нарушая двоичную совместимость для зависимого кода. С полями вам нужно перекомпилировать все, даже если новая реализация использует свойство с тем же именем.
  • Databinding. Вы не можете привязать данные к полю.

Ответ 4

Здесь общий шаблон:

class Foo {

    private Bar _bar;

    //here, Foo has a Bar object.  If that object has already been instantiated, return that value.  Otherwise, get it from the database.
    public Bar bar {
        set { _bar = value;}
        get {
            if (_bar == null) {
                _bar = Bar.find_by_foo_name(this._name);
            }
            return _bar;
        }
    }
}

Короче говоря, это позволяет нам получить доступ к объекту Bar в нашем экземпляре Foo. Эта инкапсуляция означает, что нам не нужно беспокоиться о том, как извлекается Bar, или если foo.bar уже был создан. Мы можем просто использовать объект и позволить внутренностям класса Foo заботиться об этом.

Ответ 5

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

Кроме того, он немного чище:

myObject.Property1 = "Test String";
Console.WriteLine(myObject.Property1);

Чем вы видите на некоторых других языках:

myObject.setProperty1("Test String");
System.out.writeln(myObject.getProperty1());

Здесь случай, когда вы можете инкапсулировать некоторую логику:

public int Order
{
    get { return m_order; }
    set
    {
        // Put some rules checking here. Maybe a call to make sure that the order isn't duplicated or some other error based on your business rules.
        m_order = value;
    }
}

Другим способом они будут полезны:

public int Order { get; private set; }

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

Наконец, если вам нужно управлять логикой, вы можете написать это:

public int Order
{
    get { return m_order; }
    protected set
    {
        // Again, you can do some checking here if you want...
        m_order = value;
        // You can also do other updates if necessary. Perhaps a database update...
    }
}

Ответ 6

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

Ответ 7

Преимущества времени разработки

Свойства упрощают визуальное проектирование, у вас есть самый известный браузер свойств Visual Studio, чтобы вы могли изменять свойства объекта.

Свойства также предоставляют дополнительные метаданные проверки, визуальный внешний вид внутри Property Browser, такие как drop down, range, pick pick и т.д.

Отдельные данные и действия

Они действительно представляют разницу между "данными" объекта и "Действиями" (Способами) объекта.

Когда мы смотрим на класс, если у нас есть 50 методов для поиска, не все всегда будут использовать правильное назначение функций, что усложнит понимание позже. Я всегда говорю программистам, что всякий раз, когда вы программируете, напишите код таким образом, чтобы через 5 лет, если кто-то еще смотрит на код, он должен понимать код.

Использование имен методов доступа к данным и некоторых действий создает путаницу в долгосрочной перспективе... например, в случае Stack, Push/Pop - это действия, но "Size" или "Count" - это данные.

Создание свойства "Count" просто отличает его назначение как данные вместо действия.

Databinding

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

Ограничения доступа

Вы можете иметь свойства readonly и дополнительные аксессоры, как упоминалось другими.

Отражение

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

Различные реализации хранилища

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

Validation

Свойство свойства может потребовать определенной проверки, а код проверки в части "Установить" кода может легко помочь вам правильно проверить ошибки ввода и отчета.

Уведомления

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

Короче говоря, его новый "стандарт" хранения данных, который имеет расширенные возможности, просто просто сохраняет данные в членах класса. Обычно избегая свойств, вы можете выполнять все функции, но поскольку реализация может отличаться от человека к человеку, это стандарт, который помогает каждому определять/получать доступ/проверять/уведомлять хранилище данных в одной форме под названием "Свойства"

Ответ 8

Как отметил Джастин, инкапсуляция является одним из основных принципов ООП. Вы хотели бы сохранить внутреннее представление данных в своем классе, скрытых снаружи, и предоставить одобренные способы просмотра/управления им.

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

  • Сохраняйте валюту в 10-м центах как длинное целое число, но возвращайтесь к внешнему миру как строку с двумя десятичными пробелами и знаком $.
  • Ограничить определенное свойство только для чтения (или даже только для записи: для ex:, класс проверки пароля/хэш-генератора).
  • Измените состояние объекта так или иначе, когда это значение установлено/получено.

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

Ответ 9

Они полезны для привязки данных.