static首先是全局共享的一个资源的引用,或者是一个常量的引用 . . .
这里提出一个这种机制下可能造成的影响:近日在做一个C#的小项目时有这样一个需求,点击A窗口按钮弹出B窗口,B窗口的按钮点击后释放掉AB窗口,如图
点击此按钮后
此时我点击新窗口中的销毁按钮,窗口正常关闭,反复也都正常,但是当我点击初始化按钮多次,而在新窗口出现后不立即关闭,这样就会出现多个新窗口。
这时候问题就出现了:
无论点击那个窗口的销毁按钮都只能关闭最新的窗口,其他的只能够通过右上角X号关闭,这样分析一波代码如下:
//新窗口初始化方法
public static Form2 ff;
//初始化按钮点击事件
private void button1_Click(object sender, EventArgs e)
{
ff = new Form2();
ff.Show();
}
//新窗口按钮销毁事件
private void button1_Click(object sender, EventArgs e)
{
Form1.ff.Close();
}
当点击一次按钮时创建一个Form2的对象窗体,并显示出来,点击关闭后正常关闭,但是当点击多次初始化按钮,由于static关键字的特性,全局共享这一个引用,这个时候初始化创建了一个新对象,但是也将这个static修饰的ff指向了新对象,那么就造成老对象变成了无引用状态,内存中做的事情如下:
即由于static的特性,ff始终只有一个,但是new出来的对象却有多个,就会造成老对象栈中无引用,造成无法调用的结果
针对上述需求,解决方案如下
//每次使用到Form2窗口时都new出来一个新的窗口
private void button1_Click(object sender, EventArgs e)
{
Form2 ff = new Form2();
ff.Show();
}
//新窗口销毁按钮点击事件
private void button1_Click(object sender, EventArgs e)
{
this.Close();
}
解释下,这里就是将原来静态成员变量ff改为局部变量,这样每次方法体内的ff就会随着每次调用init方法从新申请的栈中从新创建一个ff的引用,即ff不再唯一,而销毁按钮可以利用this调用是因为button是处在Form2容器中的,即在form2中this即代表窗体,this.close()即表示button所在窗体资源的释放,内存中所做的事情如下:
jiang