Классы в C#: определение, конструкторы, деструкторы, статические члены
Что такое класс
Класс — это чертеж (blueprint) для создания объектов. Определяет, из чего состоит объект (поля/свойства) и что он может делать (методы). Объекты — экземпляры класса. Члены класса: поля, свойства, методы, конструкторы, деструкторы, события, индексаторы, операторы.
Объявление класса
<модификатор_доступа> class ИмяКласса
{
// Поля
<модификатор> <тип> поле1;
// Свойства
<модификатор> <тип> Свойство { get; set; }
// Методы
<модификатор> <возврат> Метод(параметры) { ... }
// Конструкторы
<модификатор> ИмяКласса(параметры) { ... }
// Деструктор
~ИмяКласса() { ... }
}
По умолчанию: класс — internal, члены — private. Доступ к членам через точку: obj.Метод().
Пример: класс Box
public class Box
{
public double Length;
public double Breadth;
public double Height;
public double GetVolume() => Length * Breadth * Height;
}
Box box1 = new Box();
box1.Length = 6; box1.Breadth = 7; box1.Height = 5;
Console.WriteLine(box1.GetVolume()); // 210
Инкапсуляция через свойства
Поля делают private, доступ — через публичные свойства/методы:
public class Box
{
private double length;
private double breadth;
private double height;
public double Length { get => length; set => length = value; }
public double Breadth { get => breadth; set => breadth = value; }
public double Height { get => height; set => height = value; }
public double GetVolume() => length * breadth * height;
}
Конструкторы
Специальный метод, вызываемый при создании объекта (new ClassName()). Имя = имени класса, нет типа возврата.
Конструктор по умолчанию (parameterless)
public class Line
{
private double length;
public Line()
{
Console.WriteLine("Object created");
length = 0;
}
}
Параметризованный конструктор
public Line(double len)
{
Console.WriteLine($"Object created, length = {len}");
length = len;
}
// Использование
Line line = new Line(10.0); // length = 10
Конструкторы и инициализация
- Если НЕ объявлен ни один конструктор — компилятор создаёт неявный parameterless конструктор (поля = default)
- Если объявлен ХОТЯ БЫ ОДИН конструктор — неявный НЕ создаётся
- Можно вызывать другой конструктор через
this(...) - Для структур: parameterless конструктор всегда неявный, свой нельзя объявить
Деструкторы (Finalizers)
Метод очистки, вызываемый сборщиком мусора (GC) перед удалением объекта. Имя = ~ClassName. Нет параметров, модификаторов, не может быть вызван явно.
~Line()
{
Console.WriteLine("Object deleted");
// Освобождение неуправляемых ресурсов
}
Важно: В современном C# вместо деструкторов используют паттерн IDisposable / IAsyncDisposable и using для детерминированного освобождения ресурсов. Деструктор — запасной вариант (safety net).
Статические члены
static — член принадлежит классу, а не экземпляру. Существует в единственном экземпляре.
Статические поля
public class Counter
{
public static int Count = 0; // одна копия на все экземпляры
public Counter() => Count++;
}
var c1 = new Counter();
var c2 = new Counter();
Console.WriteLine(Counter.Count); // 2 (доступ через класс)
Статические методы
public class MathUtils
{
public static int Add(int a, int b) => a + b;
}
int sum = MathUtils.Add(5, 3); // вызов через класс
Статические методы могут обращаться ТОЛЬКО к статическим членам.
Статические конструкторы
static MyClass()
{
// Инициализация статических полей
// Вызывается один раз перед первым доступом к классу
}
Класс vs Struct — краткое резюме
- Класс — reference type, куча, наследование, GC, null
- Struct — value type, стек (обычно), копирование по значению, нет наследования, нет null (по умолчанию)
Язык C
- Классы и объекты в C#: Фундаменты надёжного ООП
- Модификаторы доступа в C#: public, private, protected, internal и другие
- Ключевое слово static в C#: статические переменные, методы и классы
- Абстрактные классы и методы в C#: практическое руководство
- Вложенные классы в C#: определение, использование и наследование
- Классы и объекты в C++: практическое руководство по объектно-ориентированному программированию
- Классы хранения в C: auto, register, static, extern — область видимости и время жизни
- Классы хранения в C++: область видимости, время жизни и использование
- Интерфейсы в C++: абстрактные классы и чисто виртуальные функции
- Структура программы на C#: основные компоненты и пример Hello World