C# 如何为窗口创建一个单例实例?
我已经搜索过在WPF中为窗口创建单例对象C# 如何为窗口创建一个单例实例?,c#,wpf,c#-4.0,singleton,C#,Wpf,C# 4.0,Singleton,我已经搜索过在WPF中为窗口创建单例对象 公共静态测试定义 { 得到 { if(formDefInstance==null)//formDefInstance.IsDisposed { 初始化定义状态=真; FormDefinition=新cas18(); 初始化定义状态=false; } 返回定义状态; } 设置{formDefInstance=value;} } 但是efinstance.IsDisposed的不起作用并引发错误 对此有什么想法吗?我不知道这是不是你想做的,但对我来说很有用
公共静态测试定义
{
得到
{
if(formDefInstance==null)//formDefInstance.IsDisposed
{
初始化定义状态=真;
FormDefinition=新cas18();
初始化定义状态=false;
}
返回定义状态;
}
设置{formDefInstance=value;}
}
但是efinstance.IsDisposed的不起作用并引发错误
对此有什么想法吗?我不知道这是不是你想做的,但对我来说很有用:
private static MyWindow _defInstance;
public static MyWindow DefInstance
{
get
{
if (null == _defInstance)
{
_defInstance = new MyWindow();
}
return _defInstance;
}
}
在MyWindow代码中:
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
this.Visibility = Visibility.Hidden;
e.Cancel = true;
}
要使用它:
DefInstance.Show();
然后,只显示一个窗口,您使用窗口的一个实例。您可以通过实现以下方法来实现这一点
private static volatile DefInstance instance;
private static object syncRoot = new Object();
private DefInstance() {}
public static DefInstance Instance
{
get
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
instance = new DefInstance();
}
}
return instance;
}
}
我想每个人都应该看看Jon Skeet的C#Depth网站。如果只是为了阅读并永久性地在他们的大脑中燃烧,单身汉们就会发出一声“a-la C”
在您的场景中,尝试实现这一点(线程安全、非惰性):
该站点中也有懒惰的
实现和该模式的各种其他实现。没有理由否决这个问题。从代码示例中可以很清楚地看出他想要做什么:他希望窗口只打开一次,但也希望检测窗口是否关闭。然后应该可以再次打开它,但屏幕上永远不应该同时有两个这样的窗口。我真的认为这是一个非常有趣的问题@ThorstenDittmar:我不是投否决票的人,但是写下“……不起作用,并且抛出错误”而不包含错误信息就像要求投否决票一样。@Heinzi虽然这个问题确实不完整,但我认为它不值得投否决票。@OP请添加错误消息。窗口类(WPF)中没有IsDisposed
属性。你说的是winforms吗?@ThorstenDittmar/ken2k:我怀疑这是对的——我想这是一个合理的理由来否决这个问题,至少在没有编辑或OP澄清的情况下。(我自己没有否决,但我知道为什么人们会这么做。)哇!为什么不稳定?singleton的目标是创建一次实例并防止随后创建实例。使用volatile
关键字可以创建一个或多个后续实例,并将其分配给DefInstance
。改为使用readonly
。将变量声明为易失性,以确保在可以访问实例变量之前完成对实例变量的赋值private static readonly DefInstance instance=new DefInstance()
确保线程安全和可访问性,并防止后续写入volatile
没有。请阅读此问题答案,然后您将能够知道我提到使用volatile的原因。。我在示例中提到了双重检查锁定方法。。有关此概念的更多信息,请参阅本文档
public sealed class DefInstance
{
private static readonly DefInstance instance = new DefInstance();
static DefInstance()
{
}
private DefInstance()
{
}
public static DefInstance Instance
{
get
{
return instance;
}
}
}