//退出
private void tsmiExit_Click(object sender, EventArgs e)
{
DialogResult result=MessageBox.Show("确定要退出吗","提示",MessageBoxButtons.OKCancel,MessageBoxIcon.Question);
if (result==DialogResult.OK)
{
this.Close();
lf.Close();
}
}其中lf 是我的第一个窗体,this是我的第二个窗体,如果按我的理解当执行到this.Close()时,此时当前窗体已经被关闭了,就不会再往下执行了,为什么我调试的时候程序执行到了lf.Close()?
你可以把
this.Close();
lf.Close();
顺序颠倒一下 变成
lf.Close();
this.Close(); 这时侯 this.Close(); 应该就不能执行了 当然 前提是lf是主窗体
是的。只有return语句和丢出异常才可以“不会再往下执行了”。
谁跟你说的进入了 dispose 方法就是 GC “清理掉”对像啊?GC在清理之前,会去掉 Dispose 方法,因此一般来说用不着画蛇添足地去自己调用 Dispose 方法。但是反过来说,代码调用 Dispose 方法(例如Close方法间接调用了 Dispose 方法),并不会去强迫 GC 去“清理掉”当前对象。有人说调用 Dispose 方法就是销毁当前对象,这是胡说八道了。我从来没有看到这个说法的出处。如果你听到这种说法,应该及时指出来一面谣言祸害更多人。
当然了,唯一的解释就是当窗体关闭后,这个对象仍然存在,所以会继续执行this.Close()下面的代码。
但是最近遇到一个单例模式,假设只有Form1、Form2两个窗体代码如下:
当然了,唯一的解释就是当窗体关闭后,这个对象仍然存在,所以会继续执行this.Close()下面的代码。
但是最近遇到一个单例模式,假设只有Form1、Form2两个窗体代码如下:你的理解根本就不对。
Form2 f2 = new Form2();
f2.Text = "hello"; //f2根本没有打开,那么它存在么?
//f2.ShowDialog(); //不写这个,窗体永远不会显示。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
Form2.GetInstance().Show();
}
}
//以下是form2
public partial class Form2 : Form
{
private Form2()
{
InitializeComponent();
}
private static Form2 uniquePlayer;
public static Form2 GetInstance()
{
if (uniquePlayer == null)
{
uniquePlayer = new Form2();
}
return uniquePlayer;
} private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
//uniquePlayer = null;
}
}
如果我没写uniquePlayer = null;这一句的话,那么当我第二次打开Form2的时候,就会提示无法访问已经释放的对象,当加上这句的时候,一切正常! 我现在有两种理解:1.当加上uniquePlayer = null;这句话时,uniquePlayer指向的对象已经被回收了 2.uniquePlayer原来指向的对象还没有被回收,只是uniquePlayer已经不再指向它了(因为uniquePlayer=null了)
呵呵~我是新手,如果有说的不对的地方,希望前辈们多多指点,本人将虚心接受……