Предоставление объектов-членов как свойств или методов в .NET - PullRequest
13 голосов
/ 03 октября 2008

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

Ответы [ 7 ]

19 голосов
/ 03 октября 2008

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

С MSDN :

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

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

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

    • Операция представляет собой преобразование, например Object.ToString.
    • Операция достаточно дорогая, и вы хотите сообщить пользователю, что он должен рассмотреть возможность кэширования результата.
    • Получение значения свойства с использованием метода доступа get будет иметь заметный побочный эффект.
    • Повторный вызов участника дважды приводит к разным результатам.
    • Порядок исполнения важен. Обратите внимание, что свойства типа должны быть установлены и извлечены в любом порядке.
    • Член является статическим, но возвращает значение, которое можно изменить.
    • Член возвращает массив. Свойства, которые возвращают массивы, могут вводить в заблуждение. Обычно необходимо вернуть копию внутреннего массива, чтобы пользователь не мог изменить внутреннее состояние. Это в сочетании с тем, что пользователь может легко предположить, что это индексированное свойство, приводит к неэффективному коду. В следующем примере кода каждый вызов свойства Methods создает копию массива. В результате в следующем цикле будет создано 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 ();
    }
11 голосов
/ 03 октября 2008

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

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

3 голосов
/ 03 октября 2008

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

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

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

1 голос
/ 03 октября 2008

Обзор

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

Синтаксис

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

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

ThisObject.ThisProperty (Index) = Новое значение

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

ThisObject.ThisProperty (Index, NewValue)

Ошибка

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

1 голос
/ 03 октября 2008

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

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

1 голос
/ 03 октября 2008

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

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

0 голосов
/ 26 февраля 2015

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

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

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