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

时间:2010-02-11 22:19:27

标签: c# .net class-design

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

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

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

5 个答案:

答案 0 :(得分:28)

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

其他优点

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

答案 1 :(得分:7)

将某个班级标记为static可以为您提供两件重要的事情。

  • 编译器验证您只将static成员放入课程中。

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

该功能是为响应NDP v1.0中的错误而发明的,其中a un-callable non-static member was included in the System.Environment class

答案 2 :(得分:6)

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

答案 3 :(得分:5)

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

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

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

答案 4 :(得分:1)

如果要强制它仅包含静态方法(典型的帮助程序类),则将类标记为静态。如果您放置一个实例方法,编译器会抱怨 - 这很好。在.NET框架的第1版中,有一个类,不记得哪一个,只是为了附带静态方法。意外地,其中一种方法没有获得静态修饰符。因为这个功能在发货时很晚就发现了。他们确实使构造函数成为私有的,因此无法使用该方法。