c#经常使用delegate和event的朋友来看一个问题
一个对象中的托管和代理,当我在用这个对象的实例化的时候写了他的+=,那么在我不再使用这个对象的时候,我一定要手动的-=才行,否则这个资源就得不到释放。是这样吗?求指正。...
一个对象中的托管和代理,当我在用这个对象的实例化的时候写了他的+=,那么在我不再使用这个对象的时候,我一定要手动的-=才行,否则这个资源就得不到释放。是这样吗?求指正。
展开
5个回答
展开全部
当你利用+=注册了事件之后,两个对象就会产生关联关系,如果不手动取消事件的注册,那么当两个对象都不被使用时,垃圾回收机制会考虑将它们回收。。。
但下面这种情况就会有些不同
a.Aevent += b.Bfunction;
如果程序中b不再被使用了,但是由于a还保留着b的引用,那么b对象只有等到a也不被使用时才会被释放,这时候如果取消了事件的注册,那么b对象就有机会被提前释放。。。
但下面这种情况就会有些不同
a.Aevent += b.Bfunction;
如果程序中b不再被使用了,但是由于a还保留着b的引用,那么b对象只有等到a也不被使用时才会被释放,这时候如果取消了事件的注册,那么b对象就有机会被提前释放。。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
public void DelegateHandle(object t)
{
Event temp = t as Event;
Console.WriteLine("HELLO,My Delegate");
temp.MONEY = temp.MONEY - 100;
Console.WriteLine("剩余元", temp.MONEY);
}
把中间Delegate类得方法参数改一下,因为您在 public delegate void Handle(object x);
中定义的Handle的委托类型的形参是object类型,参数要与委托类型严格一致,你可以到事件处理的函数里再把这个参数转化为你要用的Event类型,当然,最好加一个类型验证。
特意给你把代码复制到vs里,这个地方改了就肯定能运行了。
{
Event temp = t as Event;
Console.WriteLine("HELLO,My Delegate");
temp.MONEY = temp.MONEY - 100;
Console.WriteLine("剩余元", temp.MONEY);
}
把中间Delegate类得方法参数改一下,因为您在 public delegate void Handle(object x);
中定义的Handle的委托类型的形参是object类型,参数要与委托类型严格一致,你可以到事件处理的函数里再把这个参数转化为你要用的Event类型,当然,最好加一个类型验证。
特意给你把代码复制到vs里,这个地方改了就肯定能运行了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
+=只是注册事件的方法而已,这里好像和释放资源没啥关系
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不知道你测试过.NET的垃圾回收机制没有。我测试过,任何对象,在他的垃圾回收器里有个引用计数器,比如说你实例化了一个对象,则计数器为1,如果将这个对象传递到另外一个类中,并作为全局变量保存,则计数器为2,比方说放到一个List里面,无论你实例化该对象的地方是局部还是全局,只要有计数器不为0,则GC不会主动回收。如果在对象的生命周期类,想释放该对象的资源,你可以先移除引用,例如在List中Remove它,然后显示的设置该对象为null(这里很重要,我当时做压力测试,分配了200M的内存空间,但是如果这个数组不显示的设置为null,那么,在对他进行下一次分配以后,暂用的实际内存是400M,如果显示设置为null,则只是占用200M),例如:instance=null;。而+=这样的事件注册操作,并不会增加此类本身的引用计数器,所以,当这个对象生命周期结束时,会被自动释放(如果需要的话,请使用using语句,或者调用Dispose或Close方法)。
这个垃圾回收机制,不仅对.NET有效,在Flex(Flash)当中亦然,Flex的垃圾回收做的比.NET的还差,这个也是大多数Flex程序员抱怨的地方。
这个垃圾回收机制,不仅对.NET有效,在Flex(Flash)当中亦然,Flex的垃圾回收做的比.NET的还差,这个也是大多数Flex程序员抱怨的地方。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询