【问题标题】:Real life usage of Singleton and Static class c# [closed]单例和静态类 c# 的实际用法 [关闭]
【发布时间】:2014-06-30 07:31:04
【问题描述】:
我首先不想知道单例和静态类之间的区别。
我想知道人们什么时候应该使用单例类以及什么时候应该使用静态类。
在我的应用程序中,我将静态类用于帮助程序或实用程序方法,并将单例用于数据库连接和错误记录器类。但在静态类的帮助下,可用于返回 sql db 连接对象以及错误记录系统。
我真的很想知道其他高级开发人员在哪里使用单例类以及在哪里使用静态类。
如果有人用示例情况和示例代码讨论这个问题,那将非常有帮助。谢谢
【问题讨论】:
标签:
c#
singleton
static-class
【解决方案1】:
如果您正在创建松散耦合的系统,那么您将无法使用静态类(因为它们无法实现抽象并且无法注入)。静态类也很难模拟,所以如果你在做 TDD 或简单的单元测试,这不是你的选择。因此,我仅将它们用于与业务需求无关且不应被嘲笑的依赖项。例如。基础架构逻辑,例如日志记录或映射。
如果我不能扩展现有类,但想要方便的类似成员的 API,我也会使用静态类作为扩展方法。通常这也是与基础架构相关的扩展,如映射或序列化,不包含业务逻辑。
【解决方案2】:
一个非常广泛的问题,但会给你第一个让我想到使用Singleton的原因。
当您需要管理某些缓存对象的生命周期时,Singleton 比专用静态类更合适。当您想要刷新状态而不必担心线程安全时,单例是完美的,例如,如果您有一个用作单例的类并且它有许多缓存的属性或传入请求可能想要访问的列表。
Refresh() 方法可以简单地将当前实例设置为新实例,而不必刷新类的各个属性:
private static YourClass instance = new YourClass(); // first instance
public static void Refresh(){
instance = new YourClass(); // creates a new, refreshed instance while not needing to worry about thread safety
}
public static YourClass Instance{
get{
return instance;
}
}
【解决方案3】:
我通常在创建数据库访问对象时使用单例类。我可以在应用程序中的任何位置拥有该对象的实例。
我通常远离静态类,在加载特定资产时偶尔会出现加载器类。