当前位置: 首页 > 编程语言 > C#

处理单例实例(C#)分享

时间:2023-04-10 16:53:32 C#

处理单例实例(C#)如果单例实现了IDisposable,那么处置和重新创建实例的正确方法是什么?一种方法是保留_disposed标志并在Instance属性中检查它,但我不确定这是否是正确的方法。一个简单的例子:publicsealedclassSingleton:IDisposable{privatestaticSingleton_instance;私有对象_lock;私人UnmanagedResource_unmanaged;私人布尔_disposed;privateSingleton(){_unmanaged=newUnmanagedResource()lock;_new;disposed_j=false);}publicUnmanagedResourceUnmanaged{get{return_unmanaged;}}publicstaticSingletonInstance{get{if(_instance==null||_disposed){lock(_lock){if(_instance==null||_disposed){_instance=newSingleton();}}}返回实例;}}publicvoidDispose(){_disposed=true;尝试{_unmanaged.Dispose();}最后{GC.SuppressFinalize(this);}}}所以像这样的代码是可能的(但是,我同意,它有点违背了拥有单身人士的目的):Singleton.Instance.Dispose();Singleton.Instance.Unmanaged.UseResource();//非托管不应该为空。注意:无需过分强调Singleton和IDisposable之间的不兼容,我明白了。我需要Dispose方法在卸载ApppDomain时释放非托管资源。如果您在将此类称为Singleton时遇到问题,我可以将其重命名为LoadBalancer。问题仍将保持不变。这个LoadBalancer需要是一次性的,因为它的实例不属于任何人,但应该妥善处理。如果您需要替换单例实例,您应该考虑您的设计。如果你真的认为你应该这样做,我建议使用2个对象......一个单独的对象充当代理并且是一个真正的单身人士(生命结束==进程结束)这个对象需要公共成员来处理你的一切单例可以有,加上一个拥有真正实现对象的私有成员。所有其他成员重定向到此实现的成员。第二个对象是可以更换的一次性对象。确保只有你的单例对象持有对它的引用......这样,如果任何消费者对象持有对单例的引用阻止你替换对象并不重要......该引用将只指向代理单例并且一次性对象在很大程度上与单例通常被认为在进程/AppDomain的生命周期内存在的概念不兼容。如果您发现自己想要处置它们,那么您可能需要稍微重构一下您的解决方案。如果问题是在AppDomain卸载期间释放资源,则AppDomain负责释放资源并使用负责管理AppDomain生命周期的相同对象。然后在不实现IDisposable的情况下将此资源嵌入到Singleton中。这将正确地隔离场景的关注点。我不知道这里发生了什么。考虑这个假设的用例:using(Singletoninstance=Singleton.Instance){//对实例做一些事情。您将如何防止多个线程同时执行此代码?一个线程可以在另一个线程仍在尝试使用同一个实例时调用Dispose。试图将具有循环语义的API强制转换为单例概念就像试图将方形钩子装入圆括号中。顺便说一句,值得一提的是切线问题。实例属性不是线程安全的。至少你必须将_instance标记为易变的。仅当您使用该模式的规范实现时才会出现这种情况。您永远无法使模式安全,因为您还使用_disposed标志作为检查中的额外条件。就个人而言,我只是放弃双重检查锁定模式。也许我在问一个愚蠢的问题,但为什么你只想处理一个Singleton来创建一个新的?是否有实例目的...。这可能是我不知道的设计问题。在这种情况下,“正确的方法”可能是重新评估您需要代码做什么以及您可以使用哪些模式。以上就是C#学习教程:处理单例实例(C#)的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处: