弱引用(System.WeakReference)
作者:追风剑情 发布于:2024-1-23 15:54 分类:C#
如果应用程序的代码可以访问一个正由该程序使用的对象,垃圾回收器就不能回收该对 象, 那么,就认为应用程序对该对象具有强引用。
弱引用允许应用程序访问对象,同时也允许垃圾回收器收集相应的对象。 如果不存在强 引用,则弱引用的有限期只限于收集对象前的一个不确定的时间段。 使用弱引用时,应 用程序仍可对该对象进行强引用,这样做可防止该对象被收集。 但始终存在这样的风 险:垃圾回收器在重新建立强引用之前先处理该对象。
占用大量内存,但通过垃圾回收功能回收以后很容易重新创建的对象特别适合使用弱引 用。
假设 Windows 窗体应用中的树状视图向用户显示层次结构复杂的选项。 如果基础数据量 很大,则用户使用应用程序中的其他部分时,在内存中保留该树会导致效率低下。
当用户切换到应用的其他部分时,可以使用 WeakReference 类创建对树的弱引用,并销 毁所有强引用。 当用户切换回该树时,应用程序会尝试获得对该树的强引用,如果成 功,就不必重新构造该树。
若要对某对象建立弱引用,请使用要跟踪的对象实例创建 WeakReference。 有关代码示 例,请参阅类库中的 WeakReference。
短弱引用
垃圾回收功能回收对象后,短弱引用的目标(Target)会变为 null。 弱引用本身是托管对 象,与其他任何托管对象一样需要经过垃圾回收。 短弱引用是 WeakReference 的无 参数构造函数。
长弱引用
在对象的 Finalize 方法已调用后,长弱引用获得保留。 这样,便可以重新创建该对 象,但该对象仍保持不可预知的状态。 若要使用长引用,请在 WeakReference 构造 函数中指定 true。
如果对象类型不包含 Finalize 方法,应用的是短弱引用功能。弱引用只在目标被收 集前有效,运行终结器后可以随时收集目标。
若要建立强引用并重新使用对象,请将 WeakReference 的 Target 属性强制转换为对象类 型。 如果 Target 属性返回 null,表示对象已被收集;否则,可继续使用对象,因为应 用已重新获得对它的强引用。
使用弱引用的准则
- 仅在必要时使用长弱引用,因为在终结后对象的状态不可预知。
- 避免对小对象使用弱引用,因为指针本身可能和对象一样大,或者比对象还大。
- 避免将弱引用作为内存管理问题的自动解决方案, 而应开发一个有效的缓存策略来处理 应用程序的对象。
示例
using System;
namespace ConsoleApp12
{
internal class Program
{
static void Main(string[] args)
{
//trackResurrection=true 表示长引用,当被引用的对象执行完终结器方法后仍然被跟踪
//trackResurrection=false 表示短引用,当被引用的对象执行完终结器方法后结束跟踪
WeakReference wr1 = new WeakReference(new TestObject(), true);
WeakReference wr2 = new WeakReference(new TestObject(), true);
Console.WriteLine("wr1.IsAlive="+wr1.IsAlive);
Console.WriteLine("wr2.IsAlive="+wr2.IsAlive);
Console.WriteLine("wr1.Target="+wr1.Target);
Console.WriteLine("wr2.Target="+wr2.Target);
//对第0代进行回收
GC.Collect(0);
//GC.WaitForPendingFinalizers();
Console.WriteLine("wr1.IsAlive=" + wr1.IsAlive);
Console.WriteLine("wr2.IsAlive=" + wr2.IsAlive);
//Console.WriteLine("wr1.Target=" + wr1.Target);
//Console.WriteLine("wr2.Target=" + wr2.Target);
Console.ReadKey();
}
}
public class TestObject
{
}
}
标签: C#
日历
最新文章
随机文章
热门文章
分类
存档
- 2024年11月(3)
- 2024年10月(5)
- 2024年9月(3)
- 2024年8月(3)
- 2024年7月(11)
- 2024年6月(3)
- 2024年5月(9)
- 2024年4月(10)
- 2024年3月(11)
- 2024年2月(24)
- 2024年1月(12)
- 2023年12月(3)
- 2023年11月(9)
- 2023年10月(7)
- 2023年9月(2)
- 2023年8月(7)
- 2023年7月(9)
- 2023年6月(6)
- 2023年5月(7)
- 2023年4月(11)
- 2023年3月(6)
- 2023年2月(11)
- 2023年1月(8)
- 2022年12月(2)
- 2022年11月(4)
- 2022年10月(10)
- 2022年9月(2)
- 2022年8月(13)
- 2022年7月(7)
- 2022年6月(11)
- 2022年5月(18)
- 2022年4月(29)
- 2022年3月(5)
- 2022年2月(6)
- 2022年1月(8)
- 2021年12月(5)
- 2021年11月(3)
- 2021年10月(4)
- 2021年9月(9)
- 2021年8月(14)
- 2021年7月(8)
- 2021年6月(5)
- 2021年5月(2)
- 2021年4月(3)
- 2021年3月(7)
- 2021年2月(2)
- 2021年1月(8)
- 2020年12月(7)
- 2020年11月(2)
- 2020年10月(6)
- 2020年9月(9)
- 2020年8月(10)
- 2020年7月(9)
- 2020年6月(18)
- 2020年5月(4)
- 2020年4月(25)
- 2020年3月(38)
- 2020年1月(21)
- 2019年12月(13)
- 2019年11月(29)
- 2019年10月(44)
- 2019年9月(17)
- 2019年8月(18)
- 2019年7月(25)
- 2019年6月(25)
- 2019年5月(17)
- 2019年4月(10)
- 2019年3月(36)
- 2019年2月(35)
- 2019年1月(28)
- 2018年12月(30)
- 2018年11月(22)
- 2018年10月(4)
- 2018年9月(7)
- 2018年8月(13)
- 2018年7月(13)
- 2018年6月(6)
- 2018年5月(5)
- 2018年4月(13)
- 2018年3月(5)
- 2018年2月(3)
- 2018年1月(8)
- 2017年12月(35)
- 2017年11月(17)
- 2017年10月(16)
- 2017年9月(17)
- 2017年8月(20)
- 2017年7月(34)
- 2017年6月(17)
- 2017年5月(15)
- 2017年4月(32)
- 2017年3月(8)
- 2017年2月(2)
- 2017年1月(5)
- 2016年12月(14)
- 2016年11月(26)
- 2016年10月(12)
- 2016年9月(25)
- 2016年8月(32)
- 2016年7月(14)
- 2016年6月(21)
- 2016年5月(17)
- 2016年4月(13)
- 2016年3月(8)
- 2016年2月(8)
- 2016年1月(18)
- 2015年12月(13)
- 2015年11月(15)
- 2015年10月(12)
- 2015年9月(18)
- 2015年8月(21)
- 2015年7月(35)
- 2015年6月(13)
- 2015年5月(9)
- 2015年4月(4)
- 2015年3月(5)
- 2015年2月(4)
- 2015年1月(13)
- 2014年12月(7)
- 2014年11月(5)
- 2014年10月(4)
- 2014年9月(8)
- 2014年8月(16)
- 2014年7月(26)
- 2014年6月(22)
- 2014年5月(28)
- 2014年4月(15)
友情链接
- Unity官网
- Unity圣典
- Unity在线手册
- Unity中文手册(圣典)
- Unity官方中文论坛
- Unity游戏蛮牛用户文档
- Unity下载存档
- Unity引擎源码下载
- Unity服务
- Unity Ads
- wiki.unity3d
- Visual Studio Code官网
- SenseAR开发文档
- MSDN
- C# 参考
- C# 编程指南
- .NET Framework类库
- .NET 文档
- .NET 开发
- WPF官方文档
- uLua
- xLua
- SharpZipLib
- Protobuf-net
- Protobuf.js
- OpenSSL
- OPEN CASCADE
- JSON
- MessagePack
- C在线工具
- 游戏蛮牛
- GreenVPN
- 聚合数据
- 热云
- 融云
- 腾讯云
- 腾讯开放平台
- 腾讯游戏服务
- 腾讯游戏开发者平台
- 腾讯课堂
- 微信开放平台
- 腾讯实时音视频
- 腾讯即时通信IM
- 微信公众平台技术文档
- 白鹭引擎官网
- 白鹭引擎开放平台
- 白鹭引擎开发文档
- FairyGUI编辑器
- PureMVC-TypeScript
- 讯飞开放平台
- 亲加通讯云
- Cygwin
- Mono开发者联盟
- Scut游戏服务器引擎
- KBEngine游戏服务器引擎
- Photon游戏服务器引擎
- 码云
- SharpSvn
- 腾讯bugly
- 4399原创平台
- 开源中国
- Firebase
- Firebase-Admob-Unity
- google-services-unity
- Firebase SDK for Unity
- Google-Firebase-SDK
- AppsFlyer SDK
- android-repository
- CQASO
- Facebook开发者平台
- gradle下载
- GradleBuildTool下载
- Android Developers
- Google中国开发者
- AndroidDevTools
- Android社区
- Android开发工具
- Google Play Games Services
- Google商店
- Google APIs for Android
- 金钱豹VPN
- TouchSense SDK
- MakeHuman
- Online RSA Key Converter
- Windows UWP应用
- Visual Studio For Unity
- Open CASCADE Technology
- 慕课网
- 阿里云服务器ECS
- 在线免费文字转语音系统
- AI Studio
- 网云穿
- 百度网盘开放平台
- 迅捷画图
- 菜鸟工具
- [CSDN] 程序员研修院
- 华为人脸识别
- 百度AR导航导览SDK
- 海康威视官网
- 海康开放平台
- 海康SDK下载
- git download
交流QQ群
-
Flash游戏设计: 86184192
Unity游戏设计: 171855449
游戏设计订阅号