Данные, содержащиеся в классе, могут быть переменными или константами. При описании данных также можно указывать атрибуты и спецификаторы, задающие различные
характеристики элементов.
Синтаксис описания элемента данных следующий:
[атрибуты] [спецификаторы] [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; } // Ошибка компиляции
}