Свойства очень похожи на индексаторы. В частности, свойство состоит из имени и аксессоров get
и set
. Аксессоры служат для получения и установки значения переменной. Главное преимущество свойства заключается в том, что его имя может быть использовано в выражениях и операторах присваивания аналогично имени обычной переменной, но в действительности при обращении к свойству по имени автоматически вызываются его аксессоры get
и set
. Аналогичным образом используются аксессоры get и set индексатора.
Ниже приведена общая форма свойства:
get {
// код аксессора для чтения из поля
}
set {
// код аксессора для записи в поле
}
где int
, а set
принимает неявный параметр value, который содержит значение, присваиваемое свойству.
Следует, однако, иметь в виду, что свойства не определяют место в памяти для хранения полей, а лишь управляют доступом к полям. Это означает, что само свойство не предоставляет поле, и поэтому поле должно быть определено независимо от свойства. (Исключение из этого правила составляет
Ниже приведен простой пример программы, в которой определяется свойство MyProp
, предназначенное для доступа к полю prop
. В данном примере свойство допускает присваивание только положительных значений.
// Простой пример применения свойства.
using System;
class SimpProp {
int prop; // поле, управляемое свойством MyProp
public SimpProp() { prop = 0; }
/* Это свойство обеспечивает доступ к закрытой переменной экземпляра prop. Оно допускает присваивание только положительных значений. */
public int MyProp {
get {
return prop;
}
set {
if(value >= 0) prop = value;
}
}
}
// Продемонстрировать применение свойства,
class PropertyDemo {
static void Main() {
SimpProp ob = new SimpProp();
Console.WriteLine("Первоначальное значение ob.MyProp: " + ob.MyProp);
ob.MyProp = 100; // присвоить значение
Console.WriteLine("Текущее значение ob.MyProp: " + ob.MyProp);
// Переменной prop нельзя присвоить отрицательное значение.
Console.WriteLine("Попытка присвоить значение " +
"-10 свойству ob.MyProp");
ob.MyProp = -10;
Console.WriteLine("Текущее значение ob.MyProp: " + ob.MyProp);
}
}
Вот к какому результату приводит выполнение этого кода.
Первоначальное значение ob.MyProp: 0
Текущее значение ob.MyProp: 100
Попытка присвоить значение -10 свойству ob.MyProp
Текущее значение ob.MyProp: 100
Рассмотрим приведенный выше код более подробно. В этом коде определяется одно закрытое поле prop и свойство МуРгор
, управляющее доступом к полю prop
. Как пояснялось выше, само свойство не определяет место в памяти для хранения поля, а только управляет доступом к полю. Кроме того, поле prop
является закрытым, а значит, оно доступно МуРгор
.
Свойство МуРгор
указано как public
, а следовательно, оно доступно из кода за пределами его класса. И в этом есть своя логика, поскольку данное свойство обеспечивает доступ к полю prop
, которое является закрытым. Аксессор get
этого свойства просто возвращает значение из поля prop
, тогда как аксессор set
устанавливает значение в поле prop
в том и только в том случае, если это значение оказывается положительным. Таким образом, свойство МуРгор
контролирует значения, которые могут храниться в поле prop
. В этом, собственно, и состоит основное назначение свойств.