单例类与静态类在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<ILogger, FileLogger>();
}
我们基于以下几个要点进行比较
是否支持依赖注入
内存管理是怎样的
可扩展性
可测试性
静态类形如:
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#中的区别是什么的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。