Поделиться через


Общие сведения о свойствах

Компонент должен определять свойства, а не открытые поля, поскольку визуальные конструкторы (такие как Visual Studio) отображают в обозревателе свойств именно свойства, а не поля (другие серьезные причины для определения свойств приведены в конце данного раздела).

Свойства подобны "интеллектуальным" полям. Обычно свойство имеет сопровождаемый методом доступа закрытый элемент данных, доступ к которому синтаксически осуществляется так же, как и к полю класса. (Хотя свойства могут иметь разные уровни доступа, здесь рассматривается наиболее распространенный случай открытого доступа.) Поскольку свойства уже были доступны в предыдущих версиях Visual Basic, программисты на Visual Basic могут пропустить этот раздел.

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

  • Определение закрытого элемента данных.

    private int number = 0;
    
    Private number As Integer = 0
    
  • Определение открытого свойства с помощью синтаксиса объявления свойства. Этот синтаксис связывает закрытый элемент данных с открытым свойством посредством методов доступа get и set.

    public int MyNumber 
    {
    // Retrieves the number data member.
    get 
       { 
          return number; 
       }
    // Assigns to the number data member.
    set 
       { 
          number = value;
       }
    }
    
    Public Property MyNumber As Integer
       ' Retrieves number.
       Get 
          Return number
       End Get
       ' Assigns to number.
       Set 
          number = value
       End Set
    End Property
    

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

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

Существуют некоторые различия в синтаксисе свойств в разных языках программирования. Например, слово "property" не является зарезервированным словом в C#, но является таковым в Visual Basic. Для получения конкретных сведений, касающихся определенного языка, обратитесь к документации по этому языку.

В следующем примере определяется свойство MyNumber класса SimpleProperty и осуществляется доступ к свойству MyNumber из класса UsesSimpleProperty.

public class SimpleProperty 
{
   private int number = 0;
   public int MyNumber 
   {
   // Retrieves the data member number.
   get 
      { 
         return number; 
      }
   // Assigns to the data member number.
   set 
      { 
         number = value;
      }
   } 
// Other members.
}
public class UsesSimpleProperty
{
   public static void Main()
   {
      SimpleProperty example = new SimpleProperty();
// Sets the property.
      example.MyNumber = 5;
// Gets the property.
      int anumber = example.MyNumber;
   }
}
Public Class SimpleProperty 
    Private number As Integer = 0

    Public Property MyNumber As Integer
        ' Retrieves number.
        Get 
            Return number
        End Get
        ' Assigns to number.
        Set 
            number = value
        End Set
    End Property    

' Other members...
End Class

Public Class UsesSimpleProperty
    Public Shared Sub Main()
        Dim example As New SimpleProperty()
        ' Sets the property.
        example.MyNumber = 5
        ' Gets the property.
        Dim anumber As Integer = example.MyNumber
    End Sub
End Class

В целом методы get и set не отличаются от других методов. Они могут реализовывать любую программную логику, создавать исключения или быть переопределены, а также могут быть объявлены с использованием любых модификаторов, допустимых в языке программирования. Отметим, однако, что свойства также могут быть и статическими. Если свойство объявлено статическим, на действия методов get и set накладываются ограничения. Дополнительные сведения см. в справочнике по используемому языку программирования.

Типом свойства может быть примитивный тип, коллекция примитивных типов, определенный пользователем тип или коллекция определенных пользователем типов. Для всех примитивных типов среда .NET Framework предоставляет преобразователи типов, которые выполняют преобразования строки в значение. Подробные сведения см. в разделе Обобщенное преобразование типов. Если для свойства доступен преобразователь типа, оно может отображаться в обозревателе свойств среды проектирования. При определении пользовательских свойств для отображения их в обозревателе свойств нужно реализовать пользовательские преобразователи типа.

Если типом данных свойства является перечисление, то среда разработки (например, Microsoft Visual Studio) будет отображать свойство как раскрывающийся список в окне "Свойства". Если типом данных свойства является класс, в свою очередь имеющий свойства, они называются подсвойствами определяемого свойства. В окне "Свойства" среды Visual Studio пользователь может раскрыть свойство, чтобы увидеть его подсвойства.

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

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

См. также

Основные понятия

Атрибуты времени разработки для компонентов