C# 有没有办法测试Singleton是否被多次实例化
我试图用C#测试我的单例对象,但不知何故,我对如何使用蛮力实例化对象(使用并行foreach)并不满意C# 有没有办法测试Singleton是否被多次实例化,c#,.net,singleton,C#,.net,Singleton,我试图用C#测试我的单例对象,但不知何故,我对如何使用蛮力实例化对象(使用并行foreach)并不满意 是否有正确的方法/更好的方法来测试它?单例类只能有一个实例,如果它被初始化多次,那么这意味着您没有正确实现单例设计 您可以检查instance.Hashcode()值,无论您在哪里使用该Singleton类的实例,该值都必须保持不变。我不明白“parallel foreach”是什么意思。单例的实现方式如下: public class MyClass { private static
是否有正确的方法/更好的方法来测试它?单例类只能有一个实例,如果它被初始化多次,那么这意味着您没有正确实现单例设计
您可以检查instance.Hashcode()值,无论您在哪里使用该Singleton类的实例,该值都必须保持不变。我不明白“parallel foreach”是什么意思。单例的实现方式如下:
public class MyClass
{
private static MyClass _instance;
private MyClass()
{
//Do Stuff
}
public static MyClass GetInstance()
{
if(_instance == null)
_instance = new MyClass();
return _instance;
}
}
另一种方法是属性,而不是方法:
private static readonly object LockObject = new object();
private static MyClass _instance;
public static MyClass Instance
{
get
{
lock (LockObject)
{
return _instance ?? (_instance = new MyClass());
}
}
}
虽然我更喜欢第一种方法,因为它更容易实现,即使对于初学者来说,该属性也是一种很好的方法如果您有多个singleton实例-它不是singleton。为什么需要测试?@vasily.sib以确保我的singleton工作正常如果您发布代码,那么有人可以对该代码进行非常基本的静态分析,告诉您是否有可能多次实例化该类。如果是的话,讨论可以继续讨论如何改进设计,这样就不可能了。嗨。我将此标记为副本,但我想让您知道原因。有许多经过验证的C#方法可以创建单例。这篇链接文章提供了这方面的选项,以及Jon Skeet关于线程安全单例的伟大分解的链接。虽然您的问题是专门询问有关测试内存分配的问题,但并不是一个正确的SO问题。“Better way”问题被认为是基于观点的,而不是一个合适的SO问题。此外,如果您想知道单例是否被多次实例化,请在代码的该点放置一个断点并调试您的程序。然后你就能看到它被击中了多少次。嗨,布比,我很感谢你的回答,但是如果我的单例对象工作正常,有没有更好的方法来测试它?我目前所做的是使用多线程执行getInstance,但我对我所做的并不满意。你可以创建一个列表并在其中存储Singleton类的实例——如果你正确实现了,那么所有实例都必须是相同的。现在,从该列表遍历每个对象,并检查所有实例是否具有相同的Hashcode值。如果值相同,那么您已经实现了单例设计。如果两个对象的
.Hashcode()
相等,这并不意味着这是同一个对象。使用Object.ReferenceEquals(objA,objB)
方法。你们在这个问题上有点不对劲。查看建议的副本。如果正确实现,测试多个实例就不会成为问题。@Bhupesh:在这种情况下,请务必阅读以下内容:@DudeWhoWantsToLearn,请查看Microsoft的docs on parallel foreach:它“在多个线程上安排工作”以更快地完成循环。因此,在并行foreach中使用的单例必须是线程安全的。您的第一个示例不是线程安全的。您的第二个示例是,但是锁有点昂贵,对于循环中的每个项目,您都会命中它一次或多次。请查看Jon Skeet的文章: