静态类的好处

8

可能是重复问题:
什么是静态类的用途

声明静态类有哪些好处?

public static class MyStaticClass
{
}

除了“它不能被实例化”之外,还有其他原因吗?为什么你想要一个静态类,类应该是静态的原因是什么?“任何类都应该声明为静态,除非它的目的是被实例化”是一个好的经验法则吗?
5个回答

9

静态类作为实用函数和常量的容器而非对象本身,非常有用。如果这个类不代表一个对象,仅被用于此目的,那么将其声明为静态类是明智之举。


8
如果一个类有静态修饰符,那么:
  • 它清晰地表达了你的意图:这不仅仅是一个具有所有静态成员的类 - 它是一个只有静态成员的类
  • 你可以阻止实例化而不需要一个私有构造函数来抑制默认公共构造函数
  • 你不能声明该类型的变量
  • 你不能将该类型用作类型参数(如果我没记错的话)
  • 如果它是顶级类型,您可以在类型中声明扩展方法
尽管如此,第一点在我看来最重要。您向编译器和其他开发人员传达了意图。

在.NET项目中,创建一个静态类来在页面之间传递变量值是否可以,或者这里存在风险。我听说我们应该避免使用全局变量和静态类,除非上下文非常清晰。在我的情况下,我正在使用一个静态类来仅仅分配一个变量的值从页面1(比如,myStaticClass.City =“伦敦”),然后在页面2中访问它作为myStaticClass.City。在这种简单的情况下(只有几个类成员),是否可以使用静态类来仅仅传递同一应用程序的页面之间的变量值? - nam
1
@nam:是哪种应用程序的页面?对于 Web 应用程序来说,这绝对是一个糟糕的想法——它无法处理多个服务器的扩展,并且无法将数据分开存储以供不同用户使用。在桌面应用程序中,我会说这仍然不是一个干净或可测试的设计,但它没有同样类型的问题。 - Jon Skeet
抱歉,我忘了提到“WPF应用程序”。但是遗忘实际上对我来说很不错,因为您的回复甚至还涵盖了Web应用程序(谢谢)。 我的印象是使用静态类不一定是一个坏习惯,但是应该明智地使用 - nam
1
@nam:在静态类中存储全局可变状态(这是您提出的建议)通常不是一个好主意。全局状态很难理解和测试。只存储不可变状态并包含状态方法的静态类则可以接受。 - Jon Skeet

4
静态类和静态类成员用于创建可以在不创建类的实例的情况下访问的数据和函数。静态类成员可用于分离与任何对象标识无关的数据和行为:无论对象发生什么变化,数据和函数都不会改变。当类中没有依赖于对象标识的数据或行为时,可以使用静态类。这段话摘自MSDN,比我说得更好理解。关键事实是该对象在整个生命周期内都存在。
扩展方法也必须在静态类中编写。我倾向于将其用于字符串扩展或集合扩展。

3
你需要一个静态类来创建扩展方法。

0
一个实用类,只声明静态方法(如System.IO.File),不打算被实例化,因此通常是静态的。
而且你说得对,我认为这是一个很好的用法。单例模式则不同,因为它意味着要私有实例化。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接