Что означает ключевое слово static в C# и зачем оно нужно?
Везде вижу static: static void Main, static поля, static классы. Что это вообще значит и когда метод/поле стоит делать статическим?
class MathHelper
{
public static int Square(int x) => x * x;
}
Почему Square я могу вызвать без создания объекта?
2 ответа
static означает, что член принадлежит самому классу (типу), а не конкретному экземпляру. Поэтому статический метод вызывается через имя класса, без new.
class MathHelper
{
public static int Square(int x) => x * x;
}
int r = MathHelper.Square(5); // 25, объект не нужен
Сравните с обычным (экземплярным) членом:
class Counter
{
public static int Total; // одна на весь класс
public int Local; // своя у каждого объекта
}
var a = new Counter();
var b = new Counter();
Counter.Total++; // через класс
a.Local++; // через объект
Когда использовать static:
- методы, которые не зависят от состояния объекта (утилиты, чистые функции вроде Square, Math.Max);
- поля/свойства, общие для всех экземпляров (счётчики, кэш, настройки);
- классы целиком (
static class), если это набор утилит и создавать экземпляр бессмысленно (например,Math,Console).
Важно: статический метод не может обращаться к нестатическим полям напрямую — у него нет конкретного объекта (this). Не злоупотребляйте статикой для изменяемого состояния: глобальные статические переменные усложняют тестирование и могут давать гонки в многопоточности.
Ещё бывает статический конструктор — он выполняется один раз при первом обращении к классу и инициализирует статические данные:
class Config
{
public static readonly string Version;
static Config()
{
Version = "1.0"; // выполнится один раз
}
}
И static class нельзя инстанцировать и наследовать — в нём все члены обязаны быть static. Удобно для хелперов.