В C #, какова цель пометки класса static? - PullRequest
24 голосов
/ 12 февраля 2010

В C # какова цель пометки класса static?

Если у меня есть класс, который имеет только статические методы, я могу пометить класс как статический или нет. Почему я хочу пометить класс как статический? Хотел бы я когда-нибудь НЕ пометить класс статическим, если бы все методы были статическими, и если я планирую никогда не добавлять нестатический метод?

Я оглянулся и увидел несколько похожих вопросов, но ни один из них не был похож на этот.

Ответы [ 5 ]

28 голосов
/ 12 февраля 2010

Пометка класса как статического является декларативным оператором, который вы только собираетесь использовать для этого типа, чтобы иметь статические и константные члены. Это обеспечивается компилятором и предотвращает случайное добавление метода экземпляра к типу.

Другие преимущества

  • Методы расширения могут быть определены только в статических классах
  • Запрещает пользователям создавать экземпляр класса
  • Запрещает использование типа в качестве универсального аргумента (спасибо, Эрик!)
7 голосов
/ 12 февраля 2010

Пометка класса как static дает вам две важные вещи.

  • Проверка компилятором того, что вы помещаете только static членов в класс.

  • Очевидное утверждение для читателей вашего кода, что этот класс является только контейнером для static членов.

Эта функция была изобретена в ответ на ошибку в NDP v1.0, когда не вызываемый пользователем элемент static был включен в класс System.Environment .

6 голосов
/ 12 февраля 2010

Если вы хотите написать методы расширения, вы должны использовать статический класс. В противном случае это означает, что у класса никогда не будет данных экземпляра.

5 голосов
/ 12 февраля 2010

Это соглашение, специфичное для языка C #, в CLR нет понятия статических классов. Это гарантирует, что вы не можете случайно добавить элемент экземпляра в класс, не можете наследовать класс, а клиентский код не может случайно создать экземпляр класса. В основе лежат атрибуты TypeAttributes для класса Abstract и Sealed. Аннотация гарантирует, что новый оператор не может работать, а Sealed гарантирует, что вы не можете наследовать от класса.

Также по соглашению методы расширения должны быть статическими членами статического класса. VB.NET делает это по-другому, для этого требуется атрибут [Extension].

Использование статических классов в вашем коде не обязательно, но полезно. Их контракт очень нагляден, он облегчает понимание вашего кода. Но будьте осторожны, чтобы не использовать их в качестве средства для написания процедурного кода вместо кода ООП.

1 голос
/ 12 февраля 2010

Вы помечаете класс как статический, если хотите, чтобы он содержал только статические методы, типичный вспомогательный класс. Если вы поместите метод экземпляра, компилятор будет жаловаться - это хорошо. В версии 1 .NET Framework был класс, не помню какой, который должен был поставляться только со статическими методами. Случайно один из этих методов не получил статический модификатор. Поскольку эта функция не существовала в то время, когда ошибка была обнаружена очень поздно, после доставки. Они сделали конструктор закрытым, и поэтому метод не мог быть использован.

...