C# 有没有办法测试Singleton是否被多次实例化

C# 有没有办法测试Singleton是否被多次实例化,c#,.net,singleton,C#,.net,Singleton,我试图用C#测试我的单例对象,但不知何故,我对如何使用蛮力实例化对象(使用并行foreach)并不满意 是否有正确的方法/更好的方法来测试它?单例类只能有一个实例,如果它被初始化多次,那么这意味着您没有正确实现单例设计 您可以检查instance.Hashcode()值,无论您在哪里使用该Singleton类的实例,该值都必须保持不变。我不明白“parallel foreach”是什么意思。单例的实现方式如下: public class MyClass { private static

我试图用C#测试我的单例对象,但不知何故,我对如何使用蛮力实例化对象(使用并行foreach)并不满意


是否有正确的方法/更好的方法来测试它?

单例类只能有一个实例,如果它被初始化多次,那么这意味着您没有正确实现单例设计


您可以检查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的文章: