Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Отмечая класс как static, вы получаете две важные вещи.

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

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

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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