当前位置:编程学习 > C#/ASP.NET >>

当一个对象被添加到多个集合,当其中一个引用被删除后,全部都删除


Models.AddrLine addrline = new Models.AddrLine();
        
        Dictionary<int,Models.AddrLine> dict = new Dictionary<int,Models.AddrLine>();
        Dictionary<int, Models.AddrLine> dict2 = new Dictionary<int, Models.AddrLine>();
        dict.Add(1, addrline); dict2.Add(1, addrline);
        Models.AddrLine addrline2 =dict2[1];
        addrline2 = null;
        Response.Write(dict[1]);//我要这个时候也找不到对象,或对象为空
--------------------编程问答-------------------- 你最好封装一个集合,里面有事件通知,删除引用时,去触发相关事件,可参考观察者模式 --------------------编程问答-------------------- 使用遍历如何?观察者模式 和遍历性能有本质区别不 --------------------编程问答-------------------- 还有我想寻找一种.NET 内部处理机制自动处理,应该更快,因为我的这个是用在核心的地方会反复高频繁地调用 ,因为这个对象其实在内存中只有一个,只是被两个集合引用了而已,我想要做的就是把这个对象本生从内在中清除掉,只要只需要清除一次,其它上千个集合中引用这个对象 就自动 清除,而不去去遍历几千个集合一个一个地删除,我想这是做得到的吧?是不是需要用dispose接口可以实现? --------------------编程问答--------------------
引用 3 楼  的回复:
还有我想寻找一种.NET 内部处理机制自动处理,应该更快,因为我的这个是用在核心的地方会反复高频繁地调用 ,因为这个对象其实在内存中只有一个,只是被两个集合引用了而已,我想要做的就是把这个对象本生从内在中清除掉,只要只需要清除一次,其它上千个集合中引用这个对象 就自动 清除,而不去去遍历几千个集合一个一个地删除,我想这是做得到的吧?是不是需要用dispose接口可以实现?

用上千个集合有这必要吗? --------------------编程问答--------------------
引用 3 楼  的回复:
还有我想寻找一种.NET 内部处理机制自动处理,应该更快,因为我的这个是用在核心的地方会反复高频繁地调用 ,因为这个对象其实在内存中只有一个,只是被两个集合引用了而已,我想要做的就是把这个对象本生从内在中清除掉,只要只需要清除一次,其它上千个集合中引用这个对象 就自动 清除,而不去去遍历几千个集合一个一个地删除,我想这是做得到的吧?是不是需要用dispose接口可以实现?

这个使用dispose应该不行的,你想假设有这样一个日本人“龟田”,他所在的公司,街道,居委会都有他的信息,一旦他死了(dispose),公司,街道在默认情况下怎么可能知道他死了?必须有人通知公司和街道。

所以,建议使用观察者模式(就像1楼说的) --------------------编程问答--------------------
引用 3 楼  的回复:
还有我想寻找一种.NET 内部处理机制自动处理,应该更快,因为我的这个是用在核心的地方会反复高频繁地调用 ,因为这个对象其实在内存中只有一个,只是被两个集合引用了而已,我想要做的就是把这个对象本生从内在中清除掉,只要只需要清除一次,其它上千个集合中引用这个对象 就自动 清除,而不去去遍历几千个集合一个一个地删除,我想这是做得到的吧?是不是需要用dispose接口可以实现?

很明显,你这种需求是做不到的。

因为不管什么地方,对于引用类型存的的是引用,也可以理解为一种指针,你现在想要对象指空的时候,自动的让些指向对象的引用也指空,这本身就不现实,除非你自己弄一个通知机制,用事件或者别的方式通知对象清空引用。 --------------------编程问答--------------------  
这个使用dispose应该不行的,你想假设有这样一个日本人“龟田”,他所在的公司,街道,居委会都有他的信息,一旦他死了(dispose),公司,街道在默认情况下怎么可能知道他死了?必须有人通知公司和街道。
----------
对,一个人应该死一次,用引用会导致 这个人在公司死了,到他家去找他 依然可以找到,这是不合理 的引用为导致这种问题,如果能将一个引用指向的对象完全为null,那么所有指向他的引用都应该不能再找到他 这才合理嘛, 难道自动托管内存的语言无法实现的样的需求,真是牺牲太多了,难道每次都要在集合中遍历才能删除 --------------------编程问答-------------------- 是不是可以理解为.net中 一个对象一但new 被创建 那么这对象什么时候完全释放,不是人能精确决定的 --------------------编程问答--------------------
引用 7 楼  的回复:
这个使用dispose应该不行的,你想假设有这样一个日本人“龟田”,他所在的公司,街道,居委会都有他的信息,一旦他死了(dispose),公司,街道在默认情况下怎么可能知道他死了?必须有人通知公司和街道。
----------
对,一个人应该死一次,用引用会导致 这个人在公司死了,到他家去找他 依然可以找到,这是不合理 的引用为导致这种问题,如果能将一个引用指向的对象完全为null,那么所有指……

问你个问题,用非托管语言怎么解决这个问题,比如C或者C++。
在成千上万个地方拥有同一个指针,你怎么告诉他们这个指针当前指向的内容已经不可用了? --------------------编程问答--------------------
引用 8 楼  的回复:
是不是可以理解为.net中 一个对象一但new 被创建 那么这对象什么时候完全释放,不是人能精确决定的

对象释放不释放和引用在不在这是两个概念。 --------------------编程问答-------------------- 这个想法有问题,在内存中清除,只是表示将该实体彻底销毁.
但是其他列表中已经存在了该引用,怎么能够仅仅是简单的销毁内存的某个数据段就达到清除元素的效果?
这样做反而会造成异常.
另外.NET的对象存放的内存地址不像原生程式一样,那么容易追踪,清除.

要了解这句话的含义:
addrline2 = null;
这里并非清空内存,只是触发了addrline2这个对象的析构函数,在这个析构函数中实现IDisposable(假设你的Models.AddrLine类有实现该接口)
因此你需要在该类的析构函数中增加触发清除事件.
但是这样就够了吗?
即使你采用一楼给的提议:
"你最好封装一个集合,里面有事件通知,删除引用时,去触发相关事件,可参考观察者模式"
也很难简单的办到清空所有引用,所有涉及的元素.
为什么这样说?
因为Models.AddrLine这个类的实例,可能是另外一个Public的变量在使用,也有可能是public static的变量在使用,也有可能是同一个方法在多线程中被多次调用.
不可能在某个方法中实现一次 addrline2 = null; 就将所有列表中所有的addrline2 清空掉(这种说法其实是不正确的,因为即使是同一个addrline2值在不同作用域中是完全不同的).
因为都有各自的作用域,各自的生命周期,是完全不同的实体.

当然,可能是我想多了,也有可能是楼主说得让我这样理解了.

引用 3 楼  的回复:
还有我想寻找一种.NET 内部处理机制自动处理,应该更快,因为我的这个是用在核心的地方会反复高频繁地调用 ,因为这个对象其实在内存中只有一个,只是被两个集合引用了而已,我想要做的就是把这个对象本生从内在中清除掉,只要只需要清除一次,其它上千个集合中引用这个对象 就自动 清除,而不去去遍历几千个集合一个一个地删除,我想这是做得到的吧?是不是需要用dispose接口可以实现?
--------------------编程问答--------------------
引用 8 楼  的回复:
是不是可以理解为.net中 一个对象一但new 被创建 那么这对象什么时候完全释放,不是人能精确决定的

这个释不释放无关,你看下5楼的回复 --------------------编程问答--------------------
引用 7 楼  的回复:
这个使用dispose应该不行的,你想假设有这样一个日本人“龟田”,他所在的公司,街道,居委会都有他的信息,一旦他死了(dispose),公司,街道在默认情况下怎么可能知道他死了?必须有人通知公司和街道。
----------
对,一个人应该死一次,用引用会导致 这个人在公司死了,到他家去找他 依然可以找到,这是不合理 的引用为导致这种问题,如果能将一个引用指向的对象完全为null,那么所有指……

lz你要注意,现在其实有两个对象
1、龟田(记录的内存地址)
2、龟田在公司的记录(指针)

龟田死了(内存释放)不可能自动让龟田在公司的记录(指针)自动销毁的。怎么办,公司,街道,居委会也不可能每天都把确认员工是否活着。这样,如果员工死了,由家人发一个讣告(事件),和龟田有关系的机构各自将龟田的相关记录(指针)删除。
具体的你看看观察者模式吧,简单点就是事件和委托 --------------------编程问答-------------------- 但是 公司,街道,居委会 在下次有人找 龟田的时候 他们去找他,可以发现他死了也不晚, 就是说引用指针允许 存在,只不是引用的东西已经没有了,在你访问的时候才能发现没有了,没有了就返回一个null ,只不过延迟才发现他死了,这样还节省了资源,不即保证找他的人知道他已经死了,而且更小的系统资源开小
就像单例模式中 可以一开始就生成对象,也可以延后生成


//1 
private static SingleClass _instace = new SingleClass ();
public static  SingleClass Instance{get{return _instance;}}
//2
private static  SingleClass _instace = null;
public static  SingleClass Instance{
  get{
     if(instace == null)  _instace = new SingleClass ();
     return _instance;
  }
}

同样类似的,如果龟田在公司早已死了,但是只要在街道 ,只要有人找他就会知道,如果不找就不管,也种类型类似反射的上面代码 --------------------编程问答-------------------- 那你何苦要两个集合呢?一个集合不行吗
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,