Лекция 3. Модификаторы доступа

Все члены класса - поля, методы, свойства - все они имеют модификаторы доступа. Модификаторы доступа позволяют задать допустимую область видимости для членов класса. То есть контекст, в котором можно употреблять данную переменную или метод. В предыдущей теме мы уже с ними сталкивались, когда объявляли поля класса Book публичными (то есть с модификатором public).

В C# применяются следующие модификаторы доступа:

· public: публичный, общедоступный класс или член класса. Такой член класса доступен из любого места в коде, а также из других программ и сборок.

· private: закрытый класс или член класса. Представляет полную противоположность модификатору public. Такой закрытый класс или член класса доступен только из кода в том же классе или контексте.

· protected: такой член класса доступен из любого места в текущем классе или в производных классах.

· internal: класс и члены класса с подобным модификатором доступны из любого места кода в той же сборке, однако он недоступен для других программ и сборок (как в случае с модификатором public).

· protected internal: совмещает функционал двух модификаторов. Классы и члены класса с таким модификатором доступны из текущей сборки и из производных классов.

Объявление полей класса без модификатора доступа равнозначно их объявлению с модификатором private. Классы, объявленные без модификатора, по умолчанию имеют доступ internal.

Все классы и структуры, определенные напрямую в пространствах имен и не являющиеся вложенными в другие классы, могут иметь только модификаторы public или internal.

Посмотрим на примере и создадим следующий класс State:

public class State

{

int a; // все равно, что private int a;

private int b; // поле доступно только из текущего класса

protected int c; // доступно из текущего класса и производных классов

internal int d; // доступно в любом месте программы

protected internal int e; // доступно в любом месте программы и из классов-наследников

public int f; // доступно в любом месте программы, а также для других программ и сборок

 

private void Display_f()

{

   Console.WriteLine("Переменная f = {0}", f);

}

 

public void Display_a()

{

   Console.WriteLine("Переменная a = {0}", a);

}

 

internal void Display_b()

{

   Console.WriteLine("Переменная b = {0}", b);

}

 

protected void Display_e()

{

   Console.WriteLine("Переменная e = {0}", e);

}

}

Так как класс State объявлен с модификатором public, он будет доступен из любого места программы, а также из других программ и сборок. Класс State имеет пять полей для каждого уровня доступа. Плюс одна переменная без модификатора, которая является закрытой по умолчанию.

Также имеются четыре метода, которые будут выводить значения полей класса на экран. Обратите внимание, что так как все модификаторы позволяют использовать члены класса внутри данного класса, то и все переменные класса, в том числе закрытые, у нас доступны всем его методам, так как все находятся в контексте класса State.

Теперь посмотрим, как мы сможем использовать переменные нашего класса в программе (то есть в методе Main класса Program):

class Program

{

static void Main(string[] args)

{

   State state1 = new State();

 

   // присвоить значение переменной a у нас не получится,

   // так как она закрытая и класс Program ее не видит

   // И данную строку среда подчеркнет как неправильную

 

   state1.a = 4; //Ошибка, получить доступ нельзя

 

   // то же самое относится и к переменной b

   state1.b = 3; // Ошибка, получить доступ нельзя

 

   // присвоить значение переменной с то же не получится,

   // так как класс Program не является классом-наследником класса State

   state1.c = 1; // Ошибка, получить доступ нельзя

 

   // переменная d с модификатором internal доступна из любого места программы

   // поэтому спокойно присваиваем ей значение

   state1.d = 5;

 

   // переменная e так же доступна из любого места программы

   state1.e = 8;

 

   // переменная f общедоступна

   state1.f = 8;

 

   // Попробуем вывести значения переменных

                              

   // Так как этот метод объявлен как private, мы можем использовать его только внутри класса State

   state1.Display_f(); // Ошибка, получить доступ нельзя

 

   // Так как этот метод объявлен как protected, а класс Program не является наследником класса State

   state1.Display_e(); // Ошибка, получить доступ нельзя

 

   // Общедоступный метод

   state1.Display_a();

                              

   // Метод доступен из любого места программы

   state1.Display_b();

 

   Console.ReadLine();

}

}

Таким образом, мы смогли установить только переменные d, e и f, так как их модификаторы позволяют использовать в данном контексте. И нам оказались доступны только два метода: state1.Display_a() и state1.Display_b(). Однако, так как значения переменных a и b не были установлены, то эти методы выведут нули, так как значение переменных типа int по умолчанию инициализируются нулями.

Несмотря на то, что модификаторы public и internal похожи по своему действию, но они имеют большое отличие. Классы и члены класса с модификатором public также будут доступны и другим программам, если данных класс поместить в динамическую библиотеку dll и потом ее использовать в этих программах.

Благодаря такой системе модификаторов доступа можно скрывать некоторые моменты реализации класса от других частей программы. Такое сокрытие называется инкапсуляцией.

 

Лекция 4. Константы и поля для чтения

Полями класса называются обычные переменные уровня класса. Мы уже ранее рассматривали переменные - их объявление и инициализацию. Однако некоторые моменты мы еще не затрагивали, например, константы и поля для чтения.

Константы

Особенностью констант является то, что их значение можно установить только один раз. Например, если у нас в программе есть некоторые переменные, которые не должны изменять значение (к примеру, число PI, число e и т.д.), мы можем объявить их константами. Для этого используется ключевое слово const:

1 2 const double PI = 3.14; const double E = 2.71;

При использовании констант надо помнить, что объявить мы их можем только один раз и что к моменту компиляции они должны быть определены.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 class MathLib { public const double PI=3.141; public const double E = 2.81; public const double K;   public MathLib() { K = 2.5; // ошибка - константа должна быть определена до компиляции } }   class Program { static void Main(string[] args) { MathLib.E=3.8; // константу нельзя установить несколько раз } }

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

Поля для чтения

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

Поле для чтения объявляется с ключевым словом readonly:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 class MathLib { public readonly double K = 23; // можно так инициализировать   public MathLib(double _k) { K = _k; // поле для чтения может быть инициализировано или изменено в конструкторе после компиляции } public void ChangeField() { // так нельзя //K = 34; } }   class Program { static void Main(string[] args) { MathLib mathLib = new MathLib(3.8); Console.WriteLine(mathLib.K); // 3.8   //mathLib.K = 7.6; // поле для чтения нельзя установить вне своего класса Console.ReadLine();   } }

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



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