Отображение объектов-членов как свойств или методов в .NET.

В .NET, если класс содержит элемент, являющийся объектом класса, должен ли этот элемент отображаться как свойство или с помощью метода?

Ответ 1

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

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

Ответ 2

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

От MSDN:

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

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

    public string Name
    get 
    {
        return name;
    }
    set 
    {
        name = value;
    }
    
  • Используйте метод, когда:

    • Операция - это преобразование, например Object.ToString.
    • Операция достаточно дорогая, что вы хотите сообщить пользователю, что они должны учитывать кеширование результата.
    • Получение значения свойства с помощью get accessor будет иметь наблюдаемый побочный эффект.
    • Вызов члена дважды подряд дает разные результаты.
    • Порядок выполнения важен. Обратите внимание, что свойства типа должны быть установлены и извлечены в любом порядке.
    • Элемент статический, но возвращает значение, которое можно изменить.
    • Элемент возвращает массив. Свойства, возвращающие массивы, могут вводить в заблуждение. Обычно необходимо возвращать копию внутреннего массива, чтобы пользователь не мог изменить внутреннее состояние. Это, в сочетании с тем, что пользователь может легко предположить, что это индексированное свойство, приводит к неэффективному коду. В следующем примере кода каждый вызов свойства Методы создает копию массива. В результате в следующем цикле будет создано 2n + 1 копия массива.

      Type type = // Get a type.
      for (int i = 0; i < type.Methods.Length; i++)
      {
         if (type.Methods[i].Name.Equals ("text"))
         {
            // Perform some operation.
         }
      }
      

Следующий пример иллюстрирует правильное использование свойств и методов.

    class Connection
    {
       // The following three members should be properties
       // because they can be set in any order.
       string DNSName {get{};set{};}
       string UserName {get{};set{};}
       string Password {get{};set{};}

       // The following member should be a method
       // because the order of execution is important.
       // This method cannot be executed until after the 
       // properties have been set.
       bool Execute ();
    }

Ответ 3

Это не имеет отношения к делу.

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

Он должен быть методом, если он выполняет какое-либо действие над объектом.

Ответ 4

Недвижимость. Свойство в основном просто "дешевый" метод. Получение или установка ссылки на объект довольно дешево.

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

Ответ 5

Свойства считывают и присваивают значения экземплярам внутри класса.

Методы выполняют что-то с данными, присвоенными классу.

Ответ 6

Обзор

Как правило, свойства хранят данные для объекта, такие как Name, а методы - это действия, которые может потребоваться выполнить объект, например Move или Show. Иногда не очевидно, какие члены класса должны быть свойствами и какие должны быть методы - метод Item класса коллекции (VB) хранит и извлекает данные и может быть реализован как индексированное свойство. С другой стороны, было бы разумно реализовать Item как метод.

Синтаксис

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

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

ThisObject.ThisProperty(Index) = NewValue

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

ThisObject.ThisProperty(Index, NewValue)

Ошибки

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

Ответ 7

Раньше я путался об использовании свойства и метода. Но теперь я использую это правило в соответствии с Руководством MSDN:

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