В чем разница между статическим и нестатическим классом в C#?

«В чем разница между статическим и нестатическим классом в C#?» — вопрос из категории C# Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нестатический (обычный) класс:

  • Может быть инстанциирован (создан его экземпляр) с помощью оператора new.
  • Может содержать как статические, так и нестатические (экземплярные) члены (поля, свойства, методы).
  • Может наследоваться от другого класса и быть унаследованным.
  • Может реализовывать интерфейсы.

Статический класс (объявляется с модификатором static):

  • Нельзя создать экземпляр. Он существует как единый набор функциональности.
  • Может содержать только статические члены.
  • Не может быть унаследован или наследовать от другого класса (компилятор неявно помечает его как sealed и abstract).
  • Не может реализовывать интерфейсы (поскольку интерфейсы определяют контракты для экземпляров).
  • Не может иметь конструкторов экземпляров, но может иметь статический конструктор для инициализации.

Когда использовать:

  • Статический класс: Идеален для утилитарных методов, которые не требуют состояния (например, Math, Path, Convert). Это способ организовать методы, логически связанные, но не требующие объекта.
  • Нестатический класс: Используется для моделирования сущностей, которые имеют состояние и поведение, и которых может быть множество экземпляров (например, User, Order, FileStream).

Пример:


// Статический класс - утилита
public static class StringHelper
{
    public static bool IsNullOrEmpty(string value) => string.IsNullOrEmpty(value);
}
// Использование: StringHelper.IsNullOrEmpty(text);

// Нестатический класс - сущность
public class Logger
{
    private string _logName;
    public Logger(string name) => _logName = name;
    public void Log(string message) => Console.WriteLine($"[{_logName}]: {message}");
}
// Использование: var logger = new Logger("App"); logger.Log("Start");