Метод записи обычно содержит действия по проверке допустимости устанавливаемого значения, метод чтения может содержать, например, поддержку счетчика обращений к полю.
Значения спецификаторов для свойств и методов аналогичны. Чаще всего свойства объявляются со спецификатором public. Код доступа представляет собой блоки операторов, которые выполняются при получении ( get ) или установке ( set ) свойства. Может отсутствовать либо часть get, либо set, но не обе одновременно.
Свойства
Свойства служат для организации доступа к полям класса. Как правило, свойство связано с закрытым полем класса и определяет методы его получения и установки. Синтаксис свойства:
[ атрибуты ] [ спецификаторы ] тип имя_свойства{ [ get код_доступа ] [ set код_доступа ]}Если отсутствует часть set, свойство доступно только для чтения (read-only), если отсутствует часть get, свойство доступно только для записи (write-only). В версии C# 2.0 введена возможность задавать разный уровень доступа для частей get и set.
Пример описания свойств:
public class Button: Control { private string caption; // закрытое поле, с которым связано свойство public string Caption { // свойство get { // способ получения свойства return caption; } set { // способ установки свойства if (caption != value) { caption = value; } } } ...}В программе свойство выглядит как поле класса, например:
Button ok = new Button();ok.Caption = "OK"; // вызывается метод установки свойства string s = ok.Caption; // вызывается метод получения свойстваПри обращении к свойству автоматически вызываются указанные в нем методы чтения и установки.
Синтаксически чтение и запись свойства выглядят почти как методы. Метод get должен содержать операторreturn. В методе set используется параметр со стандартным именем value, который содержит устанавливаемое значение.
Добавим в класс Monster, описанный в листинге 5.8, свойства, позволяющие работать с закрытыми полями этого класса. Код класса несколько разрастется, зато упростится его использование.
using System;namespace ConsoleApplication1{ class Monster { public Monster() { this.health = 100; this.ammo = 100; this.name = "Noname"; } public Monster( string name ) : this() { this.name = name; } public Monster( int health, int ammo, string name ) { this.health = health; this.ammo = ammo; this.name = name; } public int Health // свойство Health связано с полем health { get { return health; } set { if (value > 0) health = value; else health = 0; } } public int Ammo // свойство Ammo связано с полем ammo { get { return ammo; } set { if (value > 0) ammo = value; else ammo = 0; } } public string Name // свойство Name связано с полем name { get { return name; } } public void Passport() { Console.WriteLine("Monster {0} \t health = {1} ammo = {2}", name, health, ammo); } string name; // закрытые поля int health, ammo; } class Class1 { static void Main() { Monster Masha = new Monster( 200, 200, "Masha" ); Masha.Passport(); --Masha.Health; // использование свойств Masha.Ammo += 100; // использование свойств Masha.Passport(); } }}Листинг 5.9. Класс Monster со свойствами (html, txt)
Результат работы программы:
Monster Masha health = 200 ammo = 200Monster Masha health = 199 ammo = 300Вопросы и задания для самостоятельной работы студента
- Перечислите и опишите элементы класса в C#.
- Опишите способы передачи параметров в методы.
- Запишите алгоритм вычисления чисел Фибоначчи с помощью рекурсии.
- Для чего в классе может потребоваться несколько конструкторов?
- Как можно вызвать один конструктор из другого? Зачем это нужно?
- Что такое this? Что в нем хранится, как он используется?
- Что такое деструктор? Гарантирует ли среда его выполнение?
- Какие действия обычно выполняются в части set свойства?
- Может ли свойство класса быть не связанным с его полями?
- Можно ли описать разные спецификаторы доступа к частям get и set свойства?