Глава 8. Введение в классы
151
чались) и
internal
. Смысл последнего будет рассмотрен позже. Ранее
мы уже обращали внимание на тот факт, что когда задаются поля класса
(а именно они определяют своими значениями состояние в данный мо-
мент объекта класса), эти поля должны задаваться с атрибутом
private
,
чтобы к ним извне не было доступа. В таком случае они доступны толь-
ко для методов, определенных в данном классе.
Что касается общедоступных (имеющих атрибут
public
) данных, то
такими данными могут быть общедоступные константы, другие поля,
которые определены лишь для чтения. Последние имеют специальный
атрибут
readonly
. Но чем отличаются константы от полей "только для
чтения"? Дело в том, что константы не всегда соответствуют всем тре-
бованиям ситуации с реализацией алгоритма. Часто случается так, что
переменную нужно получить в результате расчетов, а потом сделать ее
"только для чтения". В C# именно для таких случаев предусмотрен тип
переменных
readonly
. Переменные поля
readonly
имеют большую гиб-
кость, нежели
const
(атрибут, с которым объявляется константа), пото-
му что позволяют перед присваиванием производить различные вычис-
ления значения, которое должно быть "только для чтения". Правило
использования таких полей говорит, что вы можете присваивать им зна-
чение только в конструкторе и нигде более (лишь конструктор инициа-
лизирует поля, это его функция). Одной из основных особенностей та-
ких полей является то, что они могут принадлежать и экземплярам
класса, а не быть статическими, как константы (при объявлении кон-
станты атрибут
static
запрещен, т. к. по своей сути константа — уже
сама по себе статический элемент). Это позволяет получать различные
значения полей "только для чтения" в разных экземплярах классов. Но
если вы хотите сделать поле
readonly
статическим, то должны явно
объявить его таковым, в отличие от полей
const
.
Рассмотрим пример. Пусть в некотором классе
А
имеется метод вычис-
ления количества поставщиков
supp()
. Объекты, получаемые из клас-
са
А
, должны работать какое-то время с одним количеством поставщи-
ков, а через некоторый промежуток — с другим количеством. То есть на
определенном отрезке времени поле "Количество поставщиков", назо-
вем его
NumSupp
, должно быть как бы константой.
В описанном примере код может выглядеть так:
public class A
{
public static readonly uint NumSupp;
static A() // статический конструктор
152
Do'stlaringiz bilan baham: |