double arrow

Доступ к полям


Данные, содержащиеся в классе, могут быть переменными или константами. При описании данных также можно указывать атрибуты и специфика­торы, задающие различные

характеристики элементов.

Синтаксис описания эле­мента данных следующий:

[атрибуты] [спецификаторы] [const] тип имя [ = начальное_значение ]

Возможные значения спецификаторов приведены в следующей таблице:

Спецификатор Описание
1. public Доступ к элементу не ограничен
2. protected Доступ только из данного и производных классов
3. private Доступ только из данного класса
4. internal Доступ только из данной сборки
5. protected internal Доступ только из данного и производных классов и из данной сборки
6. new Новое описание поля, скрывающее унаследованный элемент класса
7. static Одно поле для всех экземпляров класса
8. readonly Поле доступно только для чтения (значение таких полей можно установить либо при описании, либо в конструкторе)
9. volatile Поле может изменяться другим процессом или системой

Для констант можно использо­вать только спецификаторы 1-5.

Каждое поле имеет модификатор доступа, принимающий одно из пяти значений: public, private, protected, internal и protected internal. Атрибутом доступа по умолчанию является атрибут private. Для полей клас­са этот вид доступа является предпочтительным, поскольку поля определяют внутреннее строение класса, которое должно быть скрыто от пользователя. Все методы класса имеют непосредственный доступ к его закрытым полям.

Независимо от значения атрибута доступа, все поля доступны для всех методов класса. Они являются для методов класса глобальной информацией, с которой работают все методы, извлекая из полей нужные им данные и изменяя их значения в ходе работы. Если поля доступны только для методов класса, то они имеют атрибут доступа private, который можно опускать. Такие поля считаются закрытыми, но часто желательно, чтобы некоторые из них были доступны в более широком контексте. Если некоторые поля класса A должны быть доступны для методов класса B, являющегося потомком класса A, то эти поля следует снабдить атрибутом protected. Такие поля называются защищенными. Если некоторые поля должны быть доступны для методов классов B1, B2 и так далее, дружественных по отношению к классу A, то эти поля следует снабдить атрибутом internal, а все дружественные классы B поместить в один проект (assembly). Такие поля называются дружественными. Наконец, если некоторые поля должны быть доступны для методов любого класса B, которому доступен сам класс A, то эти поля следует снабдить атрибутом public. Такие поля называются общедоступными или открытыми.

Поля, описанные со спецификатором static, а также константы существуют в един­ственном экземпляре для всех объектов класса, поэтому к ним обращаются не через имя экземпляра, а через имя класса. Обращение к полю класса выполняется с помощью операции доступа (точка). Справа от точки задается имя поля, слева — имя экземпляра для обычных полей или имя класса для статических. Рассмотрим пример создания класса Circle и два способа обращения к его полям.

class Circle

{

// Указывается что это поле доступно из любого класса, даже из другой сборки

// Также можно указать protected - поле будет доступно только из классов-

// наследников и private - доступно только из текущего класса.

public int x=0;

public int y=0;

public int radius=3;

public const double pi = 3.14;

public static string name = "Окружность";

double p;

double s;

}

class Program

{

static void Main()

{

Circle cr = new Circle(); //создание экземпляра класса

Console.WriteLine("pi=" + Circle.pi);// обращение к константе

Console.Write(Circle.name);// обращение к статическому полю

//обращение к обычным полям

Console.WriteLine(" с центром в точке ({0},{1}) и радиусом {2}", cr.x, cr.y, cr.radius);

// Console.WriteLine(cr.p); - вызовет ошибку, т.к. поле p, c имеют тип private

Console.Write("Введите коэффициент= ");

int kof = int.Parse(Console.ReadLine());

cr.x -= kof; cr.y += kof; cr.radius *= kof;

Console.WriteLine(" Новая окружность с центром в точке ({0},{1}) и радиусом {2}",

cr.x, cr.y, cr.radius);

//cr.s = 2 * Circle.pi * cr.radius; - вызовет ошибку, т.к. поле s, c имеют тип private

}

}

Также можно объявить поле как readonly - запрещается запись в поле, кроме как при инициализации посредством инициализатора или конструктора.

public class MyClass

{

// Присваиваем начальное значение в инициализаторе

readonly int a = 1;

// Присваиваем начальное значение в конструкторе

public MyClass(){ a = 3; }

public MyMethod(){ a = 5; } // Ошибка компиляции

}


Сейчас читают про: