1. Общая структура объявления класса
Итак, представьте: класс в C# — это чертёж здания. В чертеже мы описываем, сколько комнат, какой цвет стен, где стоят двери и окна. В классе — какие у объекта есть свойства (например, имя, возраст) и что он умеет делать (например, "поздороваться", "попросить зарплату").
Объявление класса всегда содержит три основных блока:
- Модификатор доступа (public, private, internal, protected) — кто может пользоваться этим классом. Для простоты сейчас будем использовать public, чтобы класс был "виден" везде.
- Ключевое слово class — чтобы компилятор понял, что мы действительно описываем класс.
- Имя класса — с большой буквы, по конвенции.
- Тело класса в фигурных скобках — тут описываем всё, из чего состоит наш класс: поля, свойства, методы.
Схематично это выглядит так:
public class ИмяКласса
{
// Здесь будут поля, свойства и методы класса
}
Пример: Класс студента
public class Student
{
// Поля (переменные, принадлежащие объекту)
public string Name;
public int Age;
}
Пока что этот класс — как пустая коробка: мы описали, что студенту полагается имя и возраст, но ничему ещё не научили его.
2. Поля класса (fields)
Поля — это переменные, которые принадлежат объекту класса. Например, у каждого студента должно быть своё имя и свой возраст — поэтому они описываются как поля:
public class Student
{
public string Name;
public int Age;
}
Теперь, когда вы создаёте объект типа Student, у каждого объекта будет своё собственное имя и возраст.
Пример создания объекта:
Student sasha = new Student();
sasha.Name = "Саша";
sasha.Age = 20;
Здесь мы создали объект sasha, а потом отдельно присвоили его полям значения. Такой подход используют для самого простого старта (про конструкторы мы очень подробно поговорим на следующей лекции).
3. Методы класса (functions)
Методы — это "глаголы" объекта, то есть его поведение. Действия, которые он умеет совершать. Например, студент может поздороваться. Для этого описывается метод внутри класса:
public class Student
{
public string Name;
public int Age;
public void SayHello()
{
Console.WriteLine($"Привет, меня зовут {Name}, мне {Age} лет!");
}
}
Теперь каждый студент может "поздороваться" — причём будет использовать собственное имя и возраст.
Пример использования метода:
Student sasha = new Student();
sasha.Name = "Саша";
sasha.Age = 20;
sasha.SayHello(); // Выведет: Привет, меня зовут Саша, мне 20 лет!
4. Свойства класса (properties)
Свойства — это "умные" поля, у которых можно задать особые действия при чтении или записи значения. В современном C# свойства используются чаще, чем поля, потому что они дают больше контроля и гибкости. Это как электричество: кажется, что просто, а возможностей — море.
public class Student
{
public string Name { get; set; }
public int Age { get; set; }
}
Здесь get; set; создают автоматически поле, но позволяют в будущем добавить логику при изменении значения. Для пользователя класса свойства выглядят почти так же как поля.
Пример:
Student katya = new Student();
katya.Name = "Катя";
katya.Age = 18;
Console.WriteLine(katya.Name); // Катя
Подробнее про свойства класса — в следующих лекциях :P
5. Комментарии
Скучная, но важная тема! Как и в остальном коде, внутри класса можно и нужно писать комментарии, чтобы объяснять, зачем нужно то или иное поле, или метод:
public class Student
{
// Имя студента
public string Name { get; set; }
// Возраст студента (в годах)
public int Age { get; set; }
// Студент здоровается
public void SayHello()
{
Console.WriteLine($"Привет, меня зовут {Name}, мне {Age} лет!");
}
}
Это повышает читаемость и помогает не заблудиться даже в большом проекте.
6. Модификаторы доступа
Модификаторы доступа — почти как двери с разными замками. Они определяют, кто и откуда может обращаться к членам класса. Основные модификаторы:
- public: доступно везде (наш случай по умолчанию).
- private: доступно только внутри этого класса.
- internal: доступно в пределах текущей сборки (проекты, библиотеки).
- protected: доступно внутри класса и его наследников.
Пример для поля, которое скрыто от внешнего мира:
public class Student
{
private int age; // Только внутри Student
public string Name { get; set; }
public void SetAge(int value)
{
if (value > 0)
age = value;
}
public int GetAge()
{
return age;
}
}
На ранних этапах часто все члены объявляют public, чтобы не путаться, но в реальных проектах это плохая практика: некоторые детали реализации лучше скрыть.
7. Статические члены класса
Иногда у класса есть такие данные или методы, которые принадлежат не отдельному объекту, а всему классу сразу. Это — статические члены (static members).
Например: мы хотим вести общий счётчик студентов.
public class Student
{
public static int StudentsCount = 0;
public string Name { get; set; }
public int Age { get; set; }
}
Доступ к статическому члену осуществляется через имя класса:
Student.StudentsCount = 0;
У каждого объекта свои свойства/поля, а вот статические — общие на всех. В примере выше, если у нас 10 студентов, у каждого своё Name, но StudentsCount — один на всех.
8. Пример: Полный класс студента (версия с методами)
Давайте соберём всё вместе и создадим класс студента, который всё умеет и правильно оформлен:
public class Student
{
// Статический счетчик студентов - относится ко всем студентам
public static int Count = 0;
// Имя и возраст - свойства
public string Name { get; set; }
public int Age { get; set; }
// Конструктор (про конструкторы — в следующей лекции)
public Student(string name, int age)
{
Name = name;
Age = age;
Count++; // Каждый раз при создании объекта увеличиваем счетчик
}
// Метод для приветствия
public void SayHello()
{
Console.WriteLine($"Привет! Я {Name}. Мне {Age} лет.");
}
}
Использование в основном приложении:
class Program
{
static void Main()
{
Student sasha = new Student("Саша", 20);
Student katya = new Student("Катя", 22);
sasha.SayHello();
katya.SayHello();
Console.WriteLine($"Всего студентов: {Student.Count}");
}
}
9. Организация кода: один файл = один класс
В .NET принято размещать каждый публичный класс в отдельном файле с именем, совпадающим с именем класса. Например:
Student.cs
|
|__ public class Student
А в основном файле программы (Program.cs) — точка входа и основной код. Это облегчает навигацию по проекту, особенно когда классов становится много.
10. Типичные ошибки при работе с классами и объектами
Ошибка №1: забыли фигурные скобки или написали их не там.
Компилятор тут же выдаст ошибку, но не всегда понятно, в чём дело. Особенно если скобки уехали в длинной конструкции — найти, где всё сломалось, бывает непросто.
Ошибка №2: объявили два класса с одинаковым именем в одном пространстве имён.
Такой "креатив" компилятор не одобрит. И хорошо — иначе вы бы сами не разобрались, к какому классу обращаетесь.
Ошибка №3: случайно дали полю то же имя, что и свойству.
Это создаёт путаницу при обращении к членам класса. Даже опытные разработчики иногда хватаются за голову: "Это я к полю или к свойству обращаюсь?"
Ошибка №4: не указали модификатор доступа.
По умолчанию класс становится internal, и если вы пишете библиотеку — это может неожиданно ограничить доступ к классу снаружи.
Ошибка №5: обращение к статическим членам через экземпляр.
Если написать student.Count вместо Student.Count, компилятор может и не запретить, но это сбивает с толку. Так вы как будто говорите, что Count относится к конкретному студенту, а на самом деле — ко всем сразу.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ