重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
单例类与静态类在c#中的区别是什么?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
你所需要的网站建设服务,我们均能行业靠前的水平为你提供.标准是产品质量的保证,主要从事成都网站设计、成都网站建设、外贸网站建设、企业网站建设、成都做手机网站、网页设计、高端网站设计、网页制作、做网站、建网站。创新互联公司拥有实力坚强的技术研发团队及素养的视觉设计专才。单例模式:属于设计模式中创建类型的模式,通过单例模式的方法创建的类,在当前程序中只有一个实例,当然可以实现为线程安全的单例。
这里简单复习下创建代码:
使用时实例化,多线程应用时,使用不当会有线程安全问题。
public class SingletonA { //私有成员,使用时分配内存 private static SingletonA _instance = null; //私有构造,杜绝直接new类 private SingletonA() { } //获取实例 public static SingletonA GetInstance () { if (_instance == null) { _instance = new SingletonA(); } return _instance; } }
声明实例时实例化,多线程应用时,使用不当会有线程安全问题。
public class SingletonB { //私有静态成员,声明类实例时,分配 private static readonly SingletonB _instance = new SingletonB(); //私有构造,杜绝直接new类 private SingletonB() { } public static SingletonB GetInstance() { return _instance; } }
推荐这个,经典的线程安全单例实现
public class SingletonD { private static SingletonD _instance = null; private static readonly object _lockObject = new object(); private SingletonD() { } public static SingletonD GetInstance() { if (_instance == null) { lock (_lockObject) { if (_instance == null) _instance = new SingletonD(); } } return _instance; } }
最精简版
public sealed class SingletonC { private SingletonC() { } public static readonly SingletonC Instance = new SingletonC(); }
//FileLogger只需要定义成一般的类即可,无需按照单例模式进行实现,当然也不能是静态类。 public void ConfigureServices(IServiceCollection services) { services.AddControllersWithViews(); services.AddSingleton(); }
我们基于以下几个要点进行比较
是否支持依赖注入
内存管理是怎样的
可扩展性
可测试性
静态类形如:
public static class StaticExample { private static readonly object lockObj = new object(); public static void Log(string message) { //Write code here to log data. } }
特性比较 | 静态类 | 单例类 |
---|---|---|
是否支持依赖注入 | 否,编译时提示静态类型不能作为类型参数 | 支持 |
内存管理是怎样的 | 静态类存储在托管堆的high frequency heap,仅当应用程序卸载时,才释放内存 | 单例类的单个实例是静态的,因此也保存在high frequency heap,当应用程序卸载时,才释放内存。但是,与只能具有静态对象的静态类不同,单例类可以同时具有静态和非静态对象。因此,从内存管理的角度来看,当您使用单例类时,可以利用垃圾回收管理对象。 |
可扩展性 | 您不能继承静态类并覆盖其方法 ;静态类不能具有扩展方法 | 单例类通常包含一个私有构造函数,并标记为已密封,以指示它既不能实例化也不能继承;因此,只有在单例类中具有非私有构造函数的情况下,才可以扩展单例类;单例类可以具有扩展方法 |
可测试性 | 模拟静态类非常困难,特别是在包含静态对象的时候。当然如果是只有静态方法,且幂等则还是很容易测试的 | 测试单例类很容易 |
看完上述内容,你们掌握单例类与静态类在c#中的区别是什么的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注创新互联行业资讯频道,感谢各位的阅读!