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

Значения спецификаторов для свойств и методов аналогичны. Чаще всего свойства объявляются со спецификатором 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

Вопросы и задания для самостоятельной работы студента

  1. Перечислите и опишите элементы класса в C#.
  2. Опишите способы передачи параметров в методы.
  3. Запишите алгоритм вычисления чисел Фибоначчи с помощью рекурсии.
  4. Для чего в классе может потребоваться несколько конструкторов?
  5. Как можно вызвать один конструктор из другого? Зачем это нужно?
  6. Что такое this? Что в нем хранится, как он используется?
  7. Что такое деструктор? Гарантирует ли среда его выполнение?
  8. Какие действия обычно выполняются в части set свойства?
  9. Может ли свойство класса быть не связанным с его полями?
  10. Можно ли описать разные спецификаторы доступа к частям get и set свойства?