Внутри класса любой член-функция может напрямую обращаться ко всем остальным членам этого же класса по имени.
Модификаторы доступа — это необязательные префиксы при объявлении членов. Они определяют, может ли другой код программы обращаться к данному члену, и пишутся перед типом или именем метода.
Поля
модификатор_доступа тип имяПоля
Методы
модификатор_доступа тип_возврата имяМетода()
{
...тело метода
}
Пять уровней доступа
privateзакрытыйpublicоткрытыйprotectedзащищённыйinternalвнутреннийprotected internalзащищённый внутренний
На данном этапе читателю достаточно изучить только private и public. Остальные уровни мы разберём в следующих уроках.
Любой член класса доступен изнутри самого класса независимо от модификатора.
Рассмотрим пример
class Robot
{
public string name;
int age;
public void SayHello()
{
Console.WriteLine($"Hello everyone my name is {name},I come from Foxdevelop.com");
Console.WriteLine($"I am {age} years old");
}
void AgeUpdate()
{
age = age+1;
}
void SayHi()
{
SayHello();
}
}Code language: C# (cs)

Из примера видно, что открытый метод SayHello, закрытые методы AgeUpdate и SayHi, закрытое поле age и открытое поле name — все они могут обращаться друг к другу, если код находится внутри класса.
Важное замечание: избегайте взаимных вызовов, они приводят к бесконечному циклу. Например:
class Robot
{
public string name;
int age;
public void SayHello()
{
Console.WriteLine($"Hello everyone my name is {name},I come from Foxdevelop.com");
Console.WriteLine($"I am {age} years old");
SayHi();
}
void AgeUpdate()
{
age = age+1;
}
void SayHi()
{
SayHello();
}
}Code language: C# (cs)
Здесь метод SayHi вызывает SayHello, а SayHello снова вызывает SayHi. Взаимные вызовы создают бесконечную рекурсию.

Это приведёт к аварийному завершению программы
Появится ошибка переполнения памяти

Кроме того, при инициализации полей нельзя напрямую вызывать обычные методы, только статические. Экземплярные методы требуют существующего объекта для вызова.

class Robot
{
public string name;
int age = GetInt();
static int GetInt()
{
return 1;
}
public void SayHello()
{
Console.WriteLine($"Hello everyone my name is {name},I come from Foxdevelop.com");
Console.WriteLine($"I am {age} years old");
}
void AgeUpdate()
{
age = age+1;
}
void SayHi()
{
SayHello();
}
}Code language: C# (cs)
Как показано на изображении, если сделать метод статическим, такой код допустим. Но учтите, что если функция GetInt возвращает изменяющееся значение при присваивании age:
class Program
{
static void Main(string[] args)
{
Robot robot1 = new Robot();
for (int i = 0; i < 100; i++)
{
robot1.WriteAge();
System.Threading.Thread.Sleep(1000);
}
}
}
class Robot
{
public string name;
int age = GetInt();
static int GetInt()
{
return DateTime.Now.Second;
}
public void WriteAge()
{
Console.WriteLine($"I am {age} years old");
}
}Code language: C# (cs)
В этом примере GetInt возвращает текущую секунду времени. В методе Main цикл выполняет вывод возраста 100 раз, после каждого вывода программа приостанавливается на одну секунду. При запуске мы заметим следующее:

Выводимое значение секунды не меняется. При инициализации age вызывается GetInt один раз, например возвращается 45. После этого переменная age навсегда сохранит значение 45, сколько бы раз мы ни выводили её. Как сказано в предыдущем разделе, начальное значение поля должно быть определено на момент инициализации.
Вернёмся к теме модификаторов доступа
Итог: изнутри класса можно обращаться ко всем его членам независимо от модификатора доступа.
private — закрытый доступ
Закрытые члены доступны только внутри класса, где они объявлены. Никакой другой класс не может читать или изменять их.
По умолчанию члены класса имеют уровень доступа private. Пропуск модификатора полностью эквивалентен явному указанию private, обе записи имеют одинаковую семантику.
int MyInt1; // неявно закрытый (по умолчанию)
private int MyInt2; // явно закрытыйCode language: C# (cs)
public — открытый доступ
Открытые члены экземпляра доступны любым другим объектам в программе. Для объявления нужно явно добавить модификатор public.
public int MyInt; // помечен модификатором publicCode language: C# (cs)
Правила видимости членов
Для визуального описания классов часто используют диаграммы классов
Весь класс рисуется в виде прямоугольника, члены показаны как внутренние зоны;
private члены: полностью внутри рамки класса, снаружи не видны;
public члены: часть элемента выходит за границы рамки класса, что означает глобальную доступность.
class Program
{
int Member1; // неявно private
private int Member2; // явно private
public int Member3; // public
}Code language: C# (cs)

Пример из этой главы
class C1
{
int F1; // неявно закрытое поле
private int F2; // явно закрытое поле
public int F3; // открытое поле
void DoCalc() // неявно закрытый метод
{
...
}
public int GetVal() // открытый метод
{
...
}
}Code language: C# (cs)
- Закрытые члены (F1, F2, DoCalc()): только код внутри класса
C1может читать, записывать и вызывать их; внешние классы их не видят вовсе; - Открытые члены (F3, GetVal()): доступны без ограничений любым другим классам и объектам программы;
- Правило внутри класса: все методы самого
C1, открытые и закрытые, могут обращаться ко всем полям и методам этого класса.
Рабочий пример кода
class Program
{
static void Main(string[] args)
{
Worker worker = new Worker();
Console.WriteLine(worker.GetHours()); // корректно, открытый член GetHours доступен снаружи
Console.WriteLine(worker.ReadSavings());//ошибка, закрытый член ReadSavings недоступен снаружи, даже через экземпляр worker.
Console.WriteLine(worker.hours); // корректно, открытое поле hours доступно снаружи
Console.WriteLine(worker.savings); //ошибка, закрытое поле savings недоступно снаружи
Console.WriteLine(worker.age); //ошибка, закрытое поле age недоступно снаружи
}
}
class Worker
{
int age; // неявно закрытое поле
private double savings; // явно закрытое поле
public int hours; // открытое поле
void ReadSavings() // неявно закрытый метод
{
Console.WriteLine(savings);
}
public int GetHours() // открытый метод
{
return hours;
}
}Code language: C# (cs)

Теперь у вас должно сформироваться базовое понимание модификаторов доступа.
Модификаторы доступа