Объявляемые в классе данные-члены обычно используются как переменные. Статические члены сохраняют значения, актуальные для всех объектов-представителей класса. Нестатические данные-члены сохраняют в переменных объекта информацию, актуальную для данного объекта.
Обращение к этим переменным производится с использованием точечной нотации, с явным указанием данного-члена, предназначенного для сохранения (или получения) значения.
В отличие от переменных, свойства не указывают конкретные места хранения. Вместо этого в свойствах используются блоки операторов, обеспечивающие доступ к данным-членам для чтения и записи значений.
Для задания свойств в языке C# используется специальный синтаксис и предполагает описание способов получения и установки значения — они называются get accessor и set accessor.
Наличие accessor’ов определяет доступность свойства для чтения и записи. При обращении к значению свойства вызывается механизм чтения (get accessor), при изменении значения вызывается механизм записи (set accessor).
class TestClass
{
int xVal; // Переменная объекта.
// Свойство, обслуживающее переменную объекта.
// Предоставляет возможность чтения и записи значений
// поля xVal.
public int Xval
{
// Эти значения реализованы в виде блоков программного кода,
// обеспечивающих получение и изменение значения поля.
// get accessor.
get
{
// Здесь можно расположить любой код.
// Он будет выполняться после обращения к свойству для
// прочтения значения.
// Например, так. Здесь получается,
// что возвращаемое значение зависит от количества
// обращений к свойству.
xVal++;
return xVal;
}
set
{
// set accessor.
// Здесь можно расположить любой код.
// Он будет выполняться после обращения к свойству для
// записи значения.
xVal = value;
}
}
}
class Class1
{
static void Main(string[] args)
{
// Создали объект X.
TestClass X = new TestClass();
// Обратились к свойству для записи в поле Xval
// значения. Обращение к свойству располагается
// СЛЕВА от операции присвоения. В свойстве Xval
// будет активизирован блок кода set.
X.Xval = 100;
// Обратились к свойству для чтения из поля Xval
// значения. Обращение к свойству располагается
// СПРАВА от операции присвоения. В свойстве Xval
// будет активизирован блок кода get.
int q = X.Xval;
}
}
Поскольку объект для доступа к данным Get концептуально равнозначен чтению значения переменной, хорошим стилем программирования считается отсутствие заметных побочных эффектов при использовании объектов для доступа к данным Get.
Значение свойства не должно зависеть от каких-либо обстоятельств, в частности, от количества обращений к объекту. Если доступ к свойству порождает (как в нашем случае) заметный побочный эффект, свойство, согласно рекомендациям по соблюдению “хорошего стиля”, желательно реализовывать как метод.