频道栏目
读书频道 > 软件开发 > C# > C#高级编程(第8版)
3.6 弱引用
2013-10-26 09:12:20     我来说两句
收藏   我要投稿

本文所属图书 > C#高级编程(第8版)

《C 高级编程(第8版)》是C 2012和 NET 4 5高级技术的终极资源,旨在帮助读者更新、提高用C 2012和 NET 4 5编写Windows应用程序、Web应用程序、Windows 8样式应用程序的技巧。本书的顶级作者专家团队首先介  立即去当当网订购

在应用程序代码内实例化一个类或结构时,只要有代码引用它,就会形成强引用。例如,如果有一个类MyClass(),并创建了一个变量myClassVariable来引用该类的对象,那么只要myClassVariable在作用域内,就存在对MyClass对象的强引用,如下所示:
MyClass myClassVariable = new MyClass();

这意味着垃圾回收器不会清理MyClass对象使用的内存。一般而言这是好事,因为可能需要访问MyClass对象,但是如果MyClass对象很大,并且不经常访问呢?此时可以创建对象的弱引用。
弱引用允许创建和使用对象,但是垃圾回收器运行时(第14章将介绍垃圾回收),就会回收对象并释放内存。由于存在潜在的bug和性能问题,一般不会这么做,但是在特定的情况下使用弱引用是很合理的。

弱引用是使用WeakReference类创建的。因为对象可能在任意时刻被回收,所以在引用该对象前必须确认它存在。以前面的MathTest类为例,这次使用WeakReference类创建对它的弱引用:
static void Main()
{
// Instantiate a weak reference to MathTest object
WeakReference mathReference = new WeakReference(new MathTest());
MathTest math;
math = mathReference.Target as MathTest;
if(math != null)
{
math.Value = 30;
Console.WriteLine("Value field of math variable contains " + math.Value);
Console.WriteLine("Square of 30 is " + math.GetSquare());
}
else
{
Console.WriteLine("Reference is not available.");
}

GC.Collect();

if(mathReference.IsAlive)
{
math = mathReference.Target as MathTest;
}
else
{
Console.WriteLine("Reference is not available.");
}
}

创建mathReference时,会向其构造函数传递一个新的MathTest对象。MathTest对象成为了WeakReference对象的目标。想要使用MathTest对象时,就需要先检查mathReference对象以确保其未被回收。IsAlive属性就用于这个目的。如果IsAlive为true,就从目标属性得到MathTest对象的引用。注意,因为Target属性返回的是Object类型,所以必须将其强制转换为MathTest类型。

然后,调用垃圾回收器(GC.Collect()),并尝试再次获得MathTest对象。这一次,IsAlive属性返回false,如果确实想要使用MathTest对象,就必须实例化一个新的MathTest对象。

您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:3.5.3 结构的构造函数
下一篇:3.7 部分类
相关文章
图文推荐
排行
热门
最新书评
特别推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站