首页 / C# / c# – 代表不会收集垃圾
c# – 代表不会收集垃圾
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 代表不会收集垃圾,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1862字,纯文字阅读大概需要3分钟。
内容图文
![c# – 代表不会收集垃圾](/upload/InfoBanner/zyjiaocheng/827/be274f9b9edb43858ae140e31263fd29.jpg)
参见英文答案 > GC of delegates, what am I missing? (my delegate is not collected) 1个
下面是一个演示此问题的控制台应用程序:
class Program
{
static void Main()
{
InitRefs();
GC.Collect();
GC.WaitForPendingFinalizers();
Console.WriteLine(_refObj.IsAlive);
Console.WriteLine(_refAction.IsAlive);
Console.WriteLine(_refEvent.IsAlive);
Console.ReadKey();
}
private static void InitRefs()
{
_refObj = new WeakReference(new object());
_refAction = new WeakReference((Action) (() => { }));
_refEvent = new WeakReference(new EventHandler((sender, eventArgs) => { }));
}
private static WeakReference _refObj;
private static WeakReference _refAction;
private static WeakReference _refEvent;
}
输出为“False True True”.
我已经使用SOS.dll试图找到使代表们保持GCed的内容,这是我获得的Action:
!gcroot 02472584
HandleTable:
006613ec (pinned handle)
-> 03473390 System.Object[]
-> 02472584 System.Action
有人可以解释发生了什么吗?
解决方法:
您的代理不会捕获任何内容,因此编译器基本上会对它们进行缓存.你可以通过这个简短的程序看到这个:
using System;
class Program
{
static void Main()
{
Action action1 = GetAction();
Action action2 = GetAction();
Console.WriteLine(ReferenceEquals(action1, action2)); // True
}
private static Action GetAction()
{
return () => {};
}
}
类中有自动生成的静态字段,这些字段是人工填充的.基本上,这是一个优化,以避免创建许多委托对象,这些委托对象都引用相同的静态方法,没有上下文来区分它们.
是的,这意味着代表们自己不会收集垃圾 – 但是他们非常轻量级(他们不会因为他们没有捕获任何变量而停止收集任何其他垃圾).
作为无法缓存委托(因此有资格进行垃圾收集)的情况的示例,请将InitRefs方法更改为:
private static void InitRefs(int x)
{
_refObj = new WeakReference(new object());
_refAction = new WeakReference((Action) (() => x.ToString() ));
_refEvent = new WeakReference(new EventHandler((sender, eventArgs) =>
x.ToString()));
}
然后,由于委托捕获x参数,因此打印False三次,因此无法缓存.
内容总结
以上是互联网集市为您收集整理的c# – 代表不会收集垃圾全部内容,希望文章能够帮你解决c# – 代表不会收集垃圾所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。