- •Классы и структуры
- •Функции-члены
- •Передача параметров в методы
- •Параметры ref
- •Параметры out
- •Свойства
- •Свойства, доступные только для чтения и только для записи
- •Модификаторы доступа для свойств
- •Автоматически реализуемые свойства
- •Замечание о встраивании
- •Индексаторы
- •Тип_элемента this[int индекс]
- •Листинг 1.
- •Листинг 2.
- •Листинг 3.
- •Листинг 4.
- •Конструкторы
- •Статические конструкторы
- •Вызов одних конструкторов из других
- •Поля readonly
- •Анонимные типы
- •Структуры
- •Структуры это типы значений
- •Структуры и наследование
- •Конструкторы структур
- •Частичные классы
- •Статические классы
- •Класс Object
- •Методы System.Object
- •Метод ToString()
- •Расширяющие методы
Свойства
Идея свойства заключается в методе или паре методов, которые ведут себя с точки зрения клиентского кода как поле. Хороший пример этого свойство Height (высота) класса Windows Forms. Предположим, имеется следующий код:
// mainForm относится к типу System.Windows.Forms
mainForm.Height = 400;
При выполнении этого кода высота окна будет установлена в 400, и вы сразу увидите изменение размеров окна на экране. Синтаксически это выглядит как установка значения поля, но на самом деле подобным образом вызывается средство доступа (accessor), которое содержит в себе код, изменяющий размер формы.
Для определения свойства на С# используется следующий синтаксис:
public string SomeProperty
{
get
{
return "Это значение свойства";
}
set
{
// Сделать все необходимое для установки свойства
}
}
Средство доступа get не принимает никаких параметров и должно возвращать значение того типа, который объявлен для свойства. Для средства доступа set не должны указываться явные параметры, но компилятор предполагает, что оно принимает один параметр по имени value, относящийся к тому же типу. В качестве примера следующий код содержит свойство по имени Age, которое устанавливает поле age. В данном примере age служит переменной заднего плана для свойства Age.
private int age;
public int Age
{
get f
{
return age;
}
set
{
age = value;
}
}
Обратите внимание на применяемые здесь соглашения об именовании. Здесь используется преимущество зависимости от регистра С#, благодаря которому общедоступное свойство именуется в стиле Pascal casing, а для эквивалентного приватного поля, если таковое присутствует, применяется стиль именования Camel casing. Некоторые разработчики предпочитают использовать имена полей с префиксом символом подчеркивания: _age. Это обеспечивает чрезвычайно согласованный способ идентификации полей.
Свойства, доступные только для чтения и только для записи
Существует возможность создать свойство, доступное только для чтения, просто исключая set из определения свойства. То есть, чтобы сделать свойство Name из предыдущего примера доступным только для чтения, необходимо поступить следующим образом:
private string name;
public string Name
{
get
{
return name;
}
}
Точно так же можно определить свойство, доступное только для записи, если исключить определение get. Однако это считается плохой практикой программирования, поскольку может ввести в заблуждение авторов клиентского кода. Вообще говоря, если возникает искушение поступить так, то лучше вместо свойства использовать метод.
Модификаторы доступа для свойств
Язык С# допускает применение различных модификаторов доступа для средств set и get свойств. Это дает возможность свойству иметь общедоступный get и приватный или защищенный set, и управлять тем, как и когда свойство может быть установлено. В следующем примере кода обратите внимание, что set имеет модификатор приватного доступа (private), a get не имеет никакого. В этом случае get получает уровень доступа самого свойства. Одно из средств доступа set или get должно иметь уровень доступа свойства. Если get также будет иметь ассоциированный с ним защищенный уровень доступа, то компилятор сгенерирует ошибку, поскольку в этом случае и set, и get получают уровень доступа, отличающийся от уровня доступа самого свойства.
public string Mame
{
get
{
return _name;
}
private set
{
_name = value;
}
}