C#单例和静态类的差异

单例与静态类的相同作用
1.单例与静态类只能拥有一个实例,该实例在应用程序的整个周期中用于保持应用程序的全局状态。
2.单例和静态类都可以实现线程安全。

单例与静态类的区别?
需要记住的是,静态类是属于C#中的一种语言功能,而单例是一种设计模式。所以两者属于不同的领域。
1.无法创建静态类的实例,但是可以创建单个类的实例,然后重用。
2.编译器编译静态类,在内部静态类视为抽象和密封类。
3.单例的构造函数始终标记私有,我们无法从单例类外部创建实例。
4.静态类是在应用程序第一次加载进行初始化,而单例加载可以懒加载也可以由CLR自动加载。
5.静态类不能作为参数传递,单例则可以作为参数传递。
6.静态类不能集成接口
7.单例的对象可以克隆,静态类不行,单例的对象可以释放,静态类不行。
8.无法使用静态类实现依赖注入,因为静态类不是接口驱动。
9.单例代表整个应用程序生命周期的单个对象,属于应用程序级别,而静态类没有任何对象指针,属于应用域级别。

单例和静态类的内存管理
静态变量或者静态类不存储在堆栈的内存当中,而堆栈的内从中存在一些称之为高频堆的特定控件,其中存储静态类和静态变量。该空间超出了垃圾收集器的范围,所以,内存只有在响应的进程或者AppDomain结束时才会被释放。

而单例类包含静态的应用,所以垃圾回收器无法回收它,并且仅仅在相应的进程或AppDomain结束时,静态类和单例都会被销毁。