c#经常使用delegate和event的朋友来看一个问题

一个对象中的托管和代理,当我在用这个对象的实例化的时候写了他的+=,那么在我不再使用这个对象的时候,我一定要手动的-=才行,否则这个资源就得不到释放。是这样吗?求指正。... 一个对象中的托管和代理,当我在用这个对象的实例化的时候写了他的+=,那么在我不再使用这个对象的时候,我一定要手动的-=才行,否则这个资源就得不到释放。是这样吗?求指正。 展开
 我来答
zk1989520
2011-07-12 · TA获得超过437个赞
知道小有建树答主
回答量:81
采纳率:0%
帮助的人:45.4万
展开全部
不对,C#语言内置了GC(垃圾回收机制),不用手动释放,程序会自动释放以往占用的内存资源。
你还可以在class中自定义回收机制,比如析构函数
在构造函数前加上~号便是析构函数了
比如
public class AA{
~AA(){
GC.Collect(); //在这里你可以手动释放内存
}
}
百度网友dd80d40
2011-07-12 · TA获得超过553个赞
知道小有建树答主
回答量:220
采纳率:0%
帮助的人:252万
展开全部
当你利用+=注册了事件之后,两个对象就会产生关联关系,如果不手动取消事件的注册,那么当两个对象都不被使用时,垃圾回收机制会考虑将它们回收。。。
但下面这种情况就会有些不同
a.Aevent += b.Bfunction;
如果程序中b不再被使用了,但是由于a还保留着b的引用,那么b对象只有等到a也不被使用时才会被释放,这时候如果取消了事件的注册,那么b对象就有机会被提前释放。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
olbdycsee
2011-07-13 · TA获得超过207个赞
知道答主
回答量:455
采纳率:0%
帮助的人:327万
展开全部
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里,这个地方改了就肯定能运行了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
LIFEXX
2011-07-12 · 超过39用户采纳过TA的回答
知道小有建树答主
回答量:148
采纳率:0%
帮助的人:104万
展开全部
+=只是注册事件的方法而已,这里好像和释放资源没啥关系
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
sweetwxh
2011-07-12
知道答主
回答量:10
采纳率:0%
帮助的人:10.6万
展开全部
不知道你测试过.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程序员抱怨的地方。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式