WinForm单例窗体的实现
刚开始用C#编程就开始考虑让弹出窗体唯一的情况。点击按钮,弹出窗体只显示一个,不重复显示。
考虑了单例模式,但是使用中出现问题就没有继续弄下去。
当时的问题是:窗体关闭之后,资源就被释放了,第4句判断的代码返回值为false,这样返回的from对象就会报错。让我很烦恼。
1 private static FrmDrill aForm = null; 2 public static FrmDrill Instance() 3 { 4 if (aForm == null) 5 { 6 aForm = new FrmDrill(); 7 } 8 return aForm; 9 }
所以一直都是在菜单或者按钮的Click事件中进行判断:
FrmDrill m_FrmDrill =null; private void tapbDrill_Click(object sender, EventArgs e) { if(m_FrmDrill==null) { m_FrmDrill =new FrmDrill(); } if(m_FrmDrill.IsDisposed) { m_FrmDrill =new FrmDrill(); } m_FrmDrill.Show(); }
a. 现在终于认识到应该这样写:
public partial class FrmDrill : Form { public FrmDrill() { InitializeComponent(); } private static FrmDrill aForm = null; public static FrmDrill Instance() { if (aForm == null) { aForm = new FrmDrill(); } return aForm; } protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); aForm = null; } private void FrmDrill_Load(object sender, EventArgs e) { } }
调用的方法如下:
1 private void tapbDrill_Click(object sender, EventArgs e) 2 { 3 FrmDrill m_FrmDrill = FrmDrill.Instance(); 4 5 m_FrmDrill.Owner = this;//这句可以让窗体一直悬浮在所属窗体的上方 6 m_FrmDrill.Show(); 7 m_FrmDrill.Activate(); 8 }
b. 或者可以这样写:
假设我们有2个WinForm,主窗体叫MainForm,子窗体叫ChildForm。先在主窗体中添加一个button1,用来实例化子窗体,我们在Form1.cs中写入下代码:
1 private static ChildForm childForm; //静态变量,保存唯一实例 2 private void button1_Click(object sender, System.EventArgs e) 3 { 4 if( childForm == null || childForm.IsDisposed ) 5 { //第一次实例化或实例化窗体被关了,都要重新实例化 6 childForm = new ChildForm(); 7 childForm.MdiParent = this; 8 childForm.Show(); //显示 9 } 10 }
考虑多线程的问题还没接触到,这里也放在这里:
chenszhs(突破程序员)的方法还需要改进一下: 如下: 首先需要声明instance为volatile,保证在多线程下,一个线程能读取到最新的值。 其次就是使用Lock。 最后就是把原来的构着函数改为private,避免了调用构着函数。 private static volatile Form1 instance = null; public static Form1 Instance { get { if(null==instance) { lock(typeof(Form1)) { if(null==instance) { instance=new Form1(); } } } return instance; } } private Form1(){}
参考文献:
http://topic.csdn.net/t/20040117/11/2671845.html
http://blog.163.com/aspnetshop@126/blog/static/173131335200910794529452/
http://www.codeproject.com/Articles/7505/Singleton-pattern-for-MDI-child-forms主要参考文章!
作者:太一吾鱼水
文章未经说明均属原创,学习笔记可能有大段的引用,一般会注明参考文献。
欢迎大家留言交流,转载请注明出处。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程