c#单例类工作良好确认

Jab*_*ovo 5 c# singleton call singleton-type

我需要关于单例模式的确认。

我有一个单例类,我将它用作 dll。我编写了一个引用此 dll 的程序,并调用了我的单例类。我写了第二个程序,我也这样做。

如果我告诉你,即使我有两个程序,它们都调用我的单例类的单个实例,我对吗?

我试图增加一个静态变量 instancenumber ,每次我通过构造函数时都会增加它,两个程序都告诉我 instancenumber 是 1。所以应该没问题,但我需要你的建议来确定。

谢谢你。此致

单例类:

namespace SingletonClassLib
{
    public class SingletonClass
    {
        public static int InstanceNumber = 0;
        private static string myName;
        #region //Singleton initialisation
        private SingletonClass() { createInstance(); }
        private void createInstance()
        {
            InstanceNumber++;
            myName = myName + InstanceNumber.ToString();
        }
        public static SingletonClass _I { get { return NTCSession._i; } }
        private class NTCSession
        {
            static NTCSession() { }
            internal static readonly SingletonClass _i = new   SingletonClass();
        }
        private static List<WeakReference> instances = new List<WeakReference>();
        #endregion //Singleton initialisation
        public static string askname { get { return myName; } }
    }
    }
Run Code Online (Sandbox Code Playgroud)

方案一:

using System.Windows.Forms;
using SingletonClassLib;

namespace Singletontest
{

public partial class Form1 : Form
{
    SingletonClass myclass = SingletonClass._I;
    public Form1()
    {
        InitializeComponent();
        string Name = SingletonClass.askname;
        MessageBox.Show("Program first: "+Name);
    }
}
}
Run Code Online (Sandbox Code Playgroud)

方案二:

using System.Windows.Forms;
using SingletonClassLib;

namespace Singletontest
{

public partial class Form1 : Form
{
    SingletonClass myclass = SingletonClass._I;
    public Form1()
    {
        InitializeComponent();
        string Name = SingletonClass.askname;
        MessageBox.Show("Program second: "+Name);
    }
}
}
Run Code Online (Sandbox Code Playgroud)

程序结果

nvo*_*igt 9

如果我告诉你,即使我有两个程序,它们都调用我的单例类的单个实例,我对吗?

不,这不是它的工作原理。您的每个程序都会在其内存空间中加载 dll 的副本,因此您的每个程序都有自己的类实例。您可以启动第一个程序 5 次,启动第二个程序 3 次,这样您的班级将有 8 个实例。

他们不会共享。

如果您需要证明,只需制作它以便您可以写入实例,例如设置名称。您将看到,无论您在一个程序中做什么,其他程序都不会看到这些更改。

在应用程序之间共享数据有不同的方法,共享 dll 中的类不是其中之一,因为每个程序加载它自己的 dll 副本。


Kru*_*sty 0

正如其他答案所表明的那样,单例实例不在两个程序之间共享。每个程序都在自己的操作系统进程中运行,该进程有自己的 DLL 副本