在C#中,标记类静态的目的是什么?

Che*_*eso 24 .net c# class-design

在C#中,标记类静态的目的是什么?

如果我有一个只有静态方法的类,我可以将该类标记为静态.为什么我要将类标记为静态?如果所有方法都是静态的,并且我打算永远不会添加非静态方法,我是否不想将类标记为静态?

我环顾四周,看到了一些类似的问题,但没有一个像这样.

Jar*_*Par 28

将类标记为static是一种声明性语句,您只希望此类型具有static和const成员.这是由编译器强制执行的,可以防止您意外地向该类型添加实例方法.

其他优点

  • 扩展方法只能在静态类中定义
  • 阻止用户创建类的实例
  • 防止使用该类型作为通用参数(感谢Eric!)

  • 它还可以防止消费者创建该类的实例.在引入静态类之前,您必须创建一个私有的无参数构造函数来强制执行此操作. (8认同)
  • 顺便提一下,使类静态也会阻止将类型用作泛型类,结构,接口,委托或方法的泛型类型参数.(对于像泛型类型参数这样的类型,你会做什么?你不能创建它,因此该类型的变量不会是非null.你不能通过类型参数调用静态方法.它将是完全没用,所以我们不允许.) (6认同)

Jay*_*uzi 7

将课程标记为static两个重要的事情.

  • 编译器验证您只将static成员放在一个类中.

  • 向您的代码的读者明确声明此类只是static成员的容器.

该功能是为了响应NDP v1.0中的一个错误而发明的,其中一个不可调用的非static成员被包含在System.Environment该类中.


Yur*_*ich 6

如果要编写扩展方法,则必须使用静态类.否则就是显示该类永远不会有任何实例数据.


Han*_*ant 5

它是一种特定于C#语言的约定,CLR没有静态类的概念.它确保您不会在类中意外添加实例成员,无法继承类和客户端代码,不会意外地创建类的实例.该类的基础TypeAttributes是Abstract和Sealed.Abstract确保新运算符无法工作,Sealed确保您不能从类继承.

同样按照惯例,扩展方法必须是静态类的静态成员.VB.NET的做法不同,它需要[Extension]属性.

在代码中使用静态类不是必需的,但它很有用.他们的合同非常具有描述性,它使您的代码更容易理解.但要注意不要将它们用作编写程序代码而不是OOP代码的工具.