Классы
самой частый объект которые создаётся в языке в нем объявляются:
- переменные
- свойства
- методы
Объявление класса
Конструктор
public class MyClass
{
}
у каждого класса есть конструктор если не указывать его явно то будет использовать по умолчанию пустой конструктор но можно и объявить его явно
public class MyClass
{
public MyClass()
{
}
}
во внутрь скобок можно передавать параметры для инициализации объекта
public class MyClass
{
private int _initNum;
public MyClass(int initNum)
{
_initNum = initNum;
}
}
также можно объявлять несколько конструкторов это называется перегрузкой
Первичный Конструктор
также есть первичный конструктор
public class MyClass(int num)
{
}
в этом случаю этот конструктор становится основным и последующие конструктор должны вызываться через него через слово this
public class MyClass(int num)
{
private int _initNum;
private string _name;
public MyClass(int initNum, string name) : this(initNum)
{
_initNum = initNum;
_name = name;
}
public MyClass() : this(0)
{
}
}
также что интересно первичный конструктор также создаёт переменные
public class MyClass(string name)
{
//сдесь за кулисами создаётся private readonly string name;
}
что позволяет не создавая явно перемены обращается к ним
Создание нового экземпляра класса
MyClass myClass = new MyClass(); // полная форма
MyClass myClass = new(); // сокращённая
Экземпляры создаются через new(). В скобках через запятую передаются параметры — они зависят от выбранного конструктора.
Ключевые слова для классов
abstract — абстрактный
public abstract class MyClassBase
{
public abstract void AbstractMethod()
}
Важно: такие классы нельзя создать напрямую. Нужен наследник, который реализует абстрактные методы.
public class MyClass : MyClassBase
{
public override void AbstractMethod()
{
// реализация
}
}
Все абстрактные методы должны быть реализованы в наследнике (если наследник тоже не абстрактный).
Что интересно: абстрактные методы ведут себя как virtual — их можно переопределять в наследниках, но в абстрактном классе у них нет реализации.
Объявление у них такое:
MyClassBase myClass = new MyClass(); // нужно явно укзать наследника
partial — частичный
// Файл 1
public partial class MyClass
{
public void MethodA() { }
}
// Файл 2
public partial class MyClass
{
public void MethodB() { }
}
public abstract partial class MyClassBase
{
public abstract void AbstractMethod()
}
Это делает класс частичным — его можно разбить на несколько файлов. Главное, чтобы имена типов совпадали.
В основном нужно для генераторов кода (например, Windows Forms, WPF, Source Generators).
sealed — запечатанный
public sealed class MyClass
{
}
Не даёт возможности наследоваться от этого класса.
Плюс: для sealed классов компилятор может делать оптимизации (виртуальные вызовы не нужны).
static — статический static
public static class MyClass
{
}
Такой класс не имеет конструкторов (экземпляры создать нельзя), и от него нельзя наследоваться.
Чаще всего в нём пишут:
- утилиты / вспомогательные методы
- методы расширения (extension methods)
- константы / общие настройки