.NET类库中的小知识:弱引用
2005-08-08 14:55
225 查看
抱歉,这是一篇2005年的文章,当时入门。.net不久,此文有误导,正确的是:
.net不使用引用计数器,文中案例的父子互相引用不会不释放,弱引用用于缓存,弱引用事件等。
1、什么是弱引用?
通常情况下,一个实例如果被其他实例引用了,那么他就不会被GC回收,而弱引用的意思是,如果一个实例没有被其他实例引用(真实引用),而仅仅是被弱引用,那么他就会被GC回收。
2、弱引用的用处。
如果建立了一个类“Class人”,他有个属性 “手”。
private Class手 _手;
而在Class手,我希望能够访问“父”,就是人,例如手在收到烫伤后,立即通知“父”:人的子对象“大脑”一个消息“好痛啊”。这个时候,就需要在Class手中定义一个“人”属性,并在Class人初始化时将自己传入。
_手 = new Class手();
_手.人 = this;
事实上,这样的做法将造成了“循环引用”的问题,这在COM时代的计数器引用方法的时代将是可怕的问题。因为人引用了手,而手又引用了人,如果试图释放人,将先要释放手,但释放手的前提是要释放人,这就是“循环引用”。
弱引用就是为了解决这个问题,如果人引用手(真引用),但手弱引用了人,这样释放人的时候,先释放手,而释放手将不再需要先释放人。
3、.NET中实现弱引用
在.NET中,MS在最底层就提供了弱引用功能,在System空间中有个WeakReference类。这里是使用这个类的演示(注意:在Set方法中使用Internal只能在.NET中收到支持,如果你使用.NET 1.x请将set单独提取为SetParent方法)
private WeakReference _parentReference;
/**//// <summary>
public object Parent {
get {
if (_parentReference != null) {
return _parentReference.Target;
}
else {
return null;
}
}
internal set {
if (value == null) {
_parentReference = null;
}
else {
_parentReference = new WeakReference(value);
}
}
}
.net不使用引用计数器,文中案例的父子互相引用不会不释放,弱引用用于缓存,弱引用事件等。
1、什么是弱引用?
通常情况下,一个实例如果被其他实例引用了,那么他就不会被GC回收,而弱引用的意思是,如果一个实例没有被其他实例引用(真实引用),而仅仅是被弱引用,那么他就会被GC回收。
2、弱引用的用处。
如果建立了一个类“Class人”,他有个属性 “手”。
private Class手 _手;
而在Class手,我希望能够访问“父”,就是人,例如手在收到烫伤后,立即通知“父”:人的子对象“大脑”一个消息“好痛啊”。这个时候,就需要在Class手中定义一个“人”属性,并在Class人初始化时将自己传入。
_手 = new Class手();
_手.人 = this;
事实上,这样的做法将造成了“循环引用”的问题,这在COM时代的计数器引用方法的时代将是可怕的问题。因为人引用了手,而手又引用了人,如果试图释放人,将先要释放手,但释放手的前提是要释放人,这就是“循环引用”。
弱引用就是为了解决这个问题,如果人引用手(真引用),但手弱引用了人,这样释放人的时候,先释放手,而释放手将不再需要先释放人。
3、.NET中实现弱引用
在.NET中,MS在最底层就提供了弱引用功能,在System空间中有个WeakReference类。这里是使用这个类的演示(注意:在Set方法中使用Internal只能在.NET中收到支持,如果你使用.NET 1.x请将set单独提取为SetParent方法)
private WeakReference _parentReference;
/**//// <summary>
public object Parent {
get {
if (_parentReference != null) {
return _parentReference.Target;
}
else {
return null;
}
}
internal set {
if (value == null) {
_parentReference = null;
}
else {
_parentReference = new WeakReference(value);
}
}
}
相关文章推荐
- NET类库中的小知识:弱引用
- .NET类库中的小知识:弱引用
- 在ASP.net中,不引用第三方类库的、轻便的、将报表导出到Excel中的方法
- ASP.NET 类库的引用
- c#.net无法直接启动带有“类库输出类型”的项目 若要调试此项目,请在此解决方案中添加一个引用库项目的可执行项目。将这个可执行项目设置为启动项-----解决办法
- asp.net中引用同一个项目中的类库 避免goToDefinition时不能到达真正的定义类
- .NET类库中的小知识:弱引用
- 使用Code First建模自引用关系笔记 asp.net core上使用redis探索(1) asp.net mvc控制器激活全分析 语言入门必学的基础知识你还记得么? 反射
- asp.net类库中添加WebService引用出现问题解决方法
- ASP.Net引用类库出现问题 二
- .net知识和学习方法系列(十七)CLR-CLR中的值类型和引用类型
- MVC.Net:添加第三方类库的bundles引用
- .NET类库中的小知识:弱引用
- 关于.Net Framework 4 Client Profile Winform 引用 .Net Framework 4 类库的问题
- ASP.Net 类库引用文件路径问题及解决方案
- ASP.net中引用自己的类库为什么不出现智能提示?VS.net中怎么样在客户端调试服务器中的存储过
- ADO.NET类库与SQL相关的知识梳理
- asp.net引用类库dll文件