2010-02-11 2 views
21

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

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

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

+0

http://stackoverflow.com/questions/576853/what-is-the-use-of-a-static-class http://stackoverflow.com/questions/241339/when-to-use-static- classes-in-c –

+0

Задайте свой вопрос, @dboarman! – Cheeso

+0

не беспокойтесь, не захотите загрязнить ваш вопрос. Думал, что кто-то может прокомментировать безопасность потоков статических членов. ;) – IAbstract

ответ

26

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

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

  • методы расширения могут быть определены только в статических классов
  • позволяет пользователям создавать экземпляр класса
  • Предотвращает использование типа в качестве общего аргумента (спасибо Эрику!)
+8

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

+0

@Joel, спасибо, что обновлено с этим – JaredPar

+6

Кстати, создание статического класса также предотвращает использование типа в качестве аргумента общего типа для общего класса, структуры, интерфейса, делегата или метода. (Что бы вы делали с таким типом, как аргумент общего типа? Вы не можете его создать, поэтому никакая переменная этого типа никогда не будет равна нулю. Вы не можете вызвать статические методы с помощью параметра типа. совершенно бесполезно, поэтому мы этого не допустим.) –

6

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

1

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

5

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

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

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

+0

+1 для деталей реализации и упоминания чрезмерного использования для написания процедурного кода. – si618

7

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

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

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

особенность была изобретена в ответ на ошибку в НПР v1.0, где a un-callable non-static member was included in the System.Environment class.

+0

Кроме того: я хотел использовать аналогичный модификатор 'readonly' для типов, который требует, чтобы все поля были помечены' readonly' и были типами, которые помечены 'readonly'. ПНР необходимо будет аннотировать соответственно, особенно примитивные типы. К сожалению, есть большой кусок кода, написанный с изменчивыми идиомами (например, «Список », так что уже слишком поздно. –

Смежные вопросы