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

StackOverflow https://stackoverflow.com/questions/164527

Вопрос

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

Это было полезно?

Решение

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

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

Другие советы

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

От MSDN:

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

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

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

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

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

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

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

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

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

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

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

Обзор

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

Синтаксис

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

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

thisObject.ThisProperty(индекс) = новое значение

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

thisObject.ThisProperty(индекс, новое значение)

Ошибки

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top