Во-первых, комментарий к ответу на вопрос о том, что означает «статический». В терминах C # «статический» означает «относящийся к самому типу, а не к экземпляру типа». Вы получаете доступ к статическому члену (из другого типа), используя имя типа вместо ссылки или значения. Например:
// Static method, so called using type name
Guid someGuid = Guid.NewGuid();
// Instance method, called on a value
string asString = someGuid.ToString();
Теперь статические классы ...
Статические классы обычно используются как "служебные" классы. Канонический пример, вероятно, System.Math
. Создавать экземпляр математики не имеет смысла - это просто «есть». Несколько правил («можно» и «нельзя»):
- Статические классы всегда происходят от
object
. Вы не можете указать другой базовый тип или заставить статический класс реализовать интерфейс.
- Статические классы не могут иметь никаких элементов экземпляра - все переменные, методы и т. Д. Должны быть статическими.
- Статические классы не могут объявлять конструкторы экземпляров, и компилятор не создает конструктор без параметров по умолчанию. (До того, как в C # 2.0 появились статические классы, люди часто создавали абстрактный класс с закрытым конструктором, который предотвращал создание экземпляров. Здесь нет необходимости.)
- Статические классы неявно являются абстрактными (то есть они скомпилированы в IL, который описывает абстрактный класс), но вы не можете добавить модификатор
abstract
самостоятельно.
- Статические классы неявно запечатаны (т.е. они скомпилированы в IL, который описывает запечатанный класс), но вы не можете добавить модификатор
sealed
самостоятельно.
- Статические классы могут быть общими.
- Статические классы могут быть вложены в нестатические или статические классы.
- Статические классы могут иметь вложенные типы, нестатические или статические.
- Методы расширения могут содержать только статические неуниверсальные классы верхнего уровня (C # 3.0).