Singleon类:
//应对于单线程
public class SingletonA
{
private static SingletonA instance;

//一个私有的构造器,禁用构造器
private SingletonA() {}

public static SingletonA Instance
{
get
{
if (instance == null)
{
instance = new SingletonA();
}
return instance;
}
}
}

//应对于多线程
public class SingletonB
{
//volatile关键字用于禁止编译器对指定的顺序进行微调。
private static volatile SingletonB instance = null;

private static object lockHelper = new object();

//一个私有的构造器,禁用构造器
private SingletonB() {}

public static SingletonB Instance
{
get
{
//双锁,用于保证只一个线程使用这里,防止多线程产生多个实例。
if (instance == null)
{
lock (lockHelper)
{
if (instance == null)
instance = new SingletonB();
}
}
return instance;
}
}
}
主程序:
public static void Main()
{
SingletonA t1 = SingletonA.Instance;

SingletonA t2 = SingletonA.Instance;

Console.WriteLine(object.ReferenceEquals(t1, t2) == true);
}
MDI窗体程序中防止子窗体被多次实例化——Singleton的C#实现
首先我们有2个Windows Form,主窗体叫Form1,子窗体叫ChildForm。在主窗体中加入一Menu,用来实例化子窗体,我们在Form1.cs中写入下代码:

private static ChildForm childForm; //静态变量,保存唯一实例

private void menuItem2_Click(object sender, System.EventArgs e)
{
ChildForm childForm = GetChildForm(); //获取子窗体对象
childForm.Show(); //显示之
}

private ChildForm GetChildForm()
{
//先后次序不能错,前一个条件用来判断是否是第一次,后一个条件用来判断子窗体是否被关闭了
if( childForm == null || childForm.IsDisposed )
{ //第一次实例化也好,被关了也好,都重新实例化
childForm = new ChildForm();
childForm.MdiParent = this;
}
return childForm;
}

//应对于单线程
public class SingletonA
{
private static SingletonA instance;
//一个私有的构造器,禁用构造器
private SingletonA() {}
public static SingletonA Instance
{
get
{
if (instance == null)
{
instance = new SingletonA();
}
return instance;
}
}
}
//应对于多线程
public class SingletonB
{
//volatile关键字用于禁止编译器对指定的顺序进行微调。
private static volatile SingletonB instance = null;
private static object lockHelper = new object();
//一个私有的构造器,禁用构造器
private SingletonB() {}
public static SingletonB Instance
{
get
{
//双锁,用于保证只一个线程使用这里,防止多线程产生多个实例。
if (instance == null)
{
lock (lockHelper)
{
if (instance == null)
instance = new SingletonB();
}
}
return instance;
}
}
}主程序:
public static void Main()
{
SingletonA t1 = SingletonA.Instance;
SingletonA t2 = SingletonA.Instance;
Console.WriteLine(object.ReferenceEquals(t1, t2) == true);
}MDI窗体程序中防止子窗体被多次实例化——Singleton的C#实现
首先我们有2个Windows Form,主窗体叫Form1,子窗体叫ChildForm。在主窗体中加入一Menu,用来实例化子窗体,我们在Form1.cs中写入下代码:
private static ChildForm childForm; //静态变量,保存唯一实例
private void menuItem2_Click(object sender, System.EventArgs e)
{
ChildForm childForm = GetChildForm(); //获取子窗体对象
childForm.Show(); //显示之
}
private ChildForm GetChildForm()
{
//先后次序不能错,前一个条件用来判断是否是第一次,后一个条件用来判断子窗体是否被关闭了
if( childForm == null || childForm.IsDisposed )
{ //第一次实例化也好,被关了也好,都重新实例化
childForm = new ChildForm();
childForm.MdiParent = this;
}
return childForm;
}




浙公网安备 33010602011771号