Public class MainClass
Set
Set
Class SampleClass
Определение свойств
Class SampleClass
Определение полей
Поля объявляются с типом подобно тому, как это делается со всеми прочими переменными [5 – Неш, C# 2010 Уск. Курс для проф.]. При этом также могут использоваться модификаторы доступа.
Определение поля: (MSDN_ООП_VB+C#_2010)
{ public string sampleField;
}
Во время создания объекта поля можно инициализировать, используя для этого различные способы. Простейший способ сделать это – прибегнуть к помощи инициализаторов. Они задаются в точке определения поля и могут применяться как для статических полей, так и для полей экземпляра, например:
private int х = 789; // Инициализация с помощью константы
private int z = A.InitZ(); // Инициализация с помощью метода
Следует обратить внимание, что эта инициализация происходит во время выполнения, а не во время компиляции. Поэтому при инициализации могут использоваться не только константы. Например, переменная z инициализируется вызовом метода A.InitZ() . Поначалу такое обозначение инициализации поля может показаться значительным сокращением, избавляющим от необходимости инициализировать все поля внутри тела конструктора. Однако для объявлений сложных типов все-таки рекомендуется инициализировать поля экземпляра внутри тела конструктора экземпляра.
Свойства – один из самых замечательных механизмов С# и CLR, который позволяет достичь лучшей инкапсуляции. Если говорить коротко, то свойства используются для ужесточения контроля доступа к внутреннему состоянию объекта.
С точки зрения клиента объекта свойство выглядит и ведет себя аналогично общедоступному полю. Доступ к свойству организован так же, как и доступ к общедоступному полю экземпляра класса. Однако свойство не имеет никакого ассоциированного с ним места хранения в объекте, как это присуще полю. Вместо этого свойство предоставляет средства доступа для чтения и записи поля. Типичный шаблон предусматривает обеспечение доступа к приватному полю класса через общедоступное свойство.
Синтаксис определения свойства очень прост. Для его реализации нужно определить поле для хранения значения свойства, а затем реализовать базовую логику для хранения и извлечения этого значения соответственно в блоках set и get, например:
{ private int sample; // Определение поля
public int Sample // Определение свойства
{ get
{ return sample; // Возвращение значения, сохраненного в поле
}
{ sample = value; // Сохранение значения в поле
}
}
}
Блок get вызывается, когда клиент объекта читает свойство, и обеспечивает возвращение значения поля, соответствующего свойству.
Блок set вызывается, когда клиент объекта пытается записать свойство. Обратите внимание, что в этом блоке нет возвращаемого значения, но есть специальная переменная value, которая доступна коду внутри этого блока и имеет тот же тип, что объявлен в качестве типа свойства. При записи значения в свойство именно через переменную value передается значение, которое клиент пытается присвоить свойству. При попытке объявить локальную переменную по имени value в блоке set, будет получена ошибка компиляции.
Пример 14.1. Определение класса T со свойством Temperature, которое просто возвращает или изменяет значение приватного поля temperature из внутреннего состояния экземпляра объекта. Затем создается объект (objT, экземпляр класса T), изменяется в нем значение указанного свойства и выводится на экран это значение.
using System;
public class T // Определение класса
{ private int temp; // Определение поля
public int Temperature // Определение свойства
{ get
{ Console.WriteLine("Извлечение значения temp.");
return temp; // Возврат значения, хранимого в поле
}
{ Console.WriteLine("Установка значения temp.");
temp = value; // Сохранение значения в поле
}
}
}
{ static void Main() // Точка входа в программу
{ T objT = new T(); // Создание экземпляра класса (объекта)
objT.Temperature = 20; // Изменение значения свойства
Console.WriteLine("T = {0}", objT.Temperature);
// Вывод значения температуры (свойства)
Console.ReadLine(); // Ожидание нажатия клавиши <Enter>
}
}
/* Вывод: