Dispose方法中, 类的event成员应该怎么处理? 是通过event的GetInvocationList()找出所有委托,然后下载吗? 但是为什么一定要卸载掉呢? 如果不卸载,调用dispose之后,把对象设为null, 等待垃圾回收。 对注册了该事件的那些方法并没有任何影响啊。因为事件已经不会触发了,不会让他们去响应。 请大家谈谈自己的想法, 谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不用管,例如cbxColorway.SelectedIndexChanged += new System.EventHandler(this.cbxColorway_SelectedIndexChanged);如果cbxColorway被销毁了,cbxColorway.SelectedIndexChanged中的event也就一起销毁了。SelectedIndexChanged就相当于成员变量而已。 那如果 是 cbxColorway.SelectedIndexChanged += new System.EventHandler(otherObj.cbxColorway_SelectedIndexChanged); 呢? otherObj是另外一个对象 其实不管这个的事。 关键是 为什么.net框架程序设计和effective c#里,都说要如果是手动调用的Dispose,那么应该释放托管资源,并且要注销事件。这里有2个问题:1. 包含事件的对象都注销了,为什么还需要注销里面的事件?因为根本就没有东西来触发这个事件了。触发事件只能是这个对象本身。2. 为什么需要释放托管资源 ? 比如对象A里有另一个对象B,它的意思就是在dispose中,如果是手动调用,那么应该释放B。请问怎么释放? B= null吗? 其实A.Dispose(true),然后A = null. 这样A不可到达了, B也变得不可到达,还有必要把B也设成null 吗? 为什么.net框架程序设计和effective c#里,都说要如果是手动调用的Dispose,那么应该释放托管资源,并且要注销事件我想,这里说的注销事件应该指:如果该IDispose对象订阅过事件,在Dispose前应该取消订阅。一个对象Dispose后,别人再调用它,就可能产生异常或不可预料的后果。比如下面的例子,一个My对象订阅了Program.DoSomething的静态事件。如果My对象没有取消订阅,那么在My对象Dispose后,触发Program.DoSomthing事件时,将调用已注销的对象,以致出现异常。 为什么需要释放托管资源 ? 比如对象A里有另一个对象B,它的意思就是在dispose中,如果是手动调用,那么应该释放B。请问怎么释放? 一般在Dispose的时候,要释放非托管资源。比如下面的例子My对象申请了一段非托管内存(以便和本地dll通讯等等),如果没有释放该资源,那么将造成内存泄露。至于及时释放托管资源,则用IComponent模式更加合适。有兴趣你可看ComponentModel下的IContainer和IComponent。请注意我的例子为求简单,没有用Dispose(bool disposing)模式,不会自动销毁。using System;using System.Runtime.InteropServices;namespace ConsoleApplication1{ class Program { public static event EventHandler DoSomething; static void Main(string[] args) { My my = new My(); FireDoSomethingEvent(); // ok my.Dispose(); FireDoSomethingEvent(); // <---- 将出现异常 } static void FireDoSomethingEvent() { if (Program.DoSomething != null) { Program.DoSomething(null, EventArgs.Empty); } } } class My : IDisposable { public My() { data = Marshal.AllocHGlobal(16 * 1024); // 申请非托管内存 Program.DoSomething += new EventHandler( this.OnDoSomething ); } public void Dispose() { Marshal.FreeHGlobal(data); // 释放非托管内存 data = IntPtr.Zero; } private void OnDoSomething(object sender, EventArgs e) { Marshal.WriteInt32(data, 1234); // 写入非托管内存 //CallNativeMethod(data); // 调用非托管dll... } private IntPtr data; }} 程序显示的问题 当Application.OpenForms遇上notifyicon 异步socket服务器端,如何实现多个客户端连接 求解:未能加载类型WebForm1 如何在点击事件中取到DataGrid的值? 美国CNN网站现在的问题变了,情况对咱们不利! 求大家在开发MIS中供应商信息表的设计字段信息 关于IHTMLImgElement接口的声明 WebRequest.GetResponse出现奇异的错误 “ 指定的注册表项不存在” ,有没有人碰到过啊?? 如何利用GDAL更新shp的坐标范围? sql連接數據庫并查詢的問題?菜菜的問題 File.Delete()路径问题
例如
cbxColorway.SelectedIndexChanged += new System.EventHandler(this.cbxColorway_SelectedIndexChanged);如果cbxColorway被销毁了,cbxColorway.SelectedIndexChanged中的event也就一起销毁了。SelectedIndexChanged就相当于成员变量而已。
呢? otherObj是另外一个对象
这里有2个问题:
1. 包含事件的对象都注销了,为什么还需要注销里面的事件?因为根本就没有东西来触发这个事件了。触发事件只能是这个对象本身。
2. 为什么需要释放托管资源 ? 比如对象A里有另一个对象B,它的意思就是在dispose中,如果是手动调用,那么应该释放B。请问怎么释放? B= null吗? 其实A.Dispose(true),然后A = null. 这样A不可到达了, B也变得不可到达,还有必要把B也设成null 吗?
为什么.net框架程序设计和effective c#里,都说要如果是手动调用的Dispose,那么应该释放托管资源,并且要注销事件
我想,这里说的注销事件应该指:如果该IDispose对象订阅过事件,在Dispose前应该取消订阅。
一个对象Dispose后,别人再调用它,就可能产生异常或不可预料的后果。比如下面的例子,一个My对象订阅了Program.DoSomething的静态事件。
如果My对象没有取消订阅,那么在My对象Dispose后,触发Program.DoSomthing事件时,将调用已注销的对象,以致出现异常。
为什么需要释放托管资源 ? 比如对象A里有另一个对象B,它的意思就是在dispose中,如果是手动调用,那么应该释放B。请问怎么释放?
一般在Dispose的时候,要释放非托管资源。比如下面的例子My对象申请了一段非托管内存(以便和本地dll通讯等等),如果没有释放该资源,那么将造成内存泄露。
至于及时释放托管资源,则用IComponent模式更加合适。有兴趣你可看ComponentModel下的IContainer和IComponent。请注意我的例子为求简单,没有用Dispose(bool disposing)模式,不会自动销毁。using System;
using System.Runtime.InteropServices;namespace ConsoleApplication1
{
class Program
{
public static event EventHandler DoSomething;
static void Main(string[] args)
{
My my = new My(); FireDoSomethingEvent(); // ok
my.Dispose(); FireDoSomethingEvent(); // <---- 将出现异常
}
static void FireDoSomethingEvent()
{
if (Program.DoSomething != null)
{
Program.DoSomething(null, EventArgs.Empty);
}
}
} class My : IDisposable
{
public My()
{
data = Marshal.AllocHGlobal(16 * 1024); // 申请非托管内存
Program.DoSomething += new EventHandler( this.OnDoSomething );
} public void Dispose()
{
Marshal.FreeHGlobal(data); // 释放非托管内存
data = IntPtr.Zero;
} private void OnDoSomething(object sender, EventArgs e)
{
Marshal.WriteInt32(data, 1234); // 写入非托管内存
//CallNativeMethod(data); // 调用非托管dll...
}
private IntPtr data;
}
}