有没有可能知道一个对象被引用了多少次?

helloparker 2004-03-31 02:37:59
我有的一个类里面有个arraylist,里面保存了一些对象的引用,其他地方也会引用arraylist中的内容。但是,我这个类定期会做一些清理工作,也就是说如果arraylist中的对象只被引用了一次(也就是说只被arraylist引用)那么就清除这一项。

能不能知道一个对象被引用的次数呢?
...全文
103 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
mengxianbao1521 2004-04-07
  • 打赏
  • 举报
回复
我也是从Delphi上转过来的。
正在学.net
helloparker 2004-04-07
  • 打赏
  • 举报
回复
感谢各位,我使用弱引用达到要求了,我最近在写一个类似于objectspaces的东东,这是最后一个问题了。虽然觉得写得不太好,但是想跟各位交流一下,如果有需要代码的可以留下email
basboy 2004-04-06
  • 打赏
  • 举报
回复
baslzy@hotmail.com

我初到这个论坛,还希望多多交流
juqiang 2004-04-06
  • 打赏
  • 举报
回复
basboy能否留一个msn或者邮件地址?谢谢!juqiang@langchao.com
basboy 2004-04-06
  • 打赏
  • 举报
回复

在.net中对象应该不是使用引用计数的方法判断对象的生存周期的(考虑一下如果对象a引用
对象b,而同时对象b又对a进行引用,那么两个对象都不能被释放)

搂主的要求我觉得使用弱引用可以实现。代码贴在上面了

我的qq:21601099,请大家多多指教
basboy 2004-04-06
  • 打赏
  • 举报
回复
using System;
using System.Collections;
using System.IO;

namespace testwkref
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class Item
{

private string m_str;
public Item(string item)
{
m_str=item;
}
public override string ToString()
{
return m_str;

}
}




class smartarrylist
{
private ArrayList m_array;
public smartarrylist()
{
m_array=new ArrayList();
}
public void additem(object item)
{
//-----注意这里添加一个弱引用---------------------
m_array.Add(new System.WeakReference(item,false));

}
public object this [int index]
{
get
{
if (index < 0 || index >=this.m_array.Count)
return null;
else
return m_array[index];
}
set
{
if (!(index < 0 || index >=this.m_array.Count))
{
//----hoho,加入的都是弱引用
m_array[index]=new System.WeakReference(value,false);
}

}
}

//----回收资源-----------
public void collect()
{

GC.Collect(); //强制垃圾回收
GC.WaitForPendingFinalizers();
GC.Collect();
//--------如果弱引用变为了null那么就清除对象-------------
for(int loop=0;loop<this.m_array.Count;loop++)
{
if(((WeakReference)m_array[loop]).Target==null)
{
//我是把它移出,要怎么处理就看你的了,毕竟已经找到了
m_array.RemoveAt(loop);
}

}

}
//-----for debug----------------
public void dump()
{
collect(); //回收一次
for(int loop=0;loop<this.m_array.Count;loop++)
{

Console.WriteLine(((WeakReference)this.m_array[loop]).Target.ToString());
}


}
//----------------------------
}




class Class1
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
//
// TODO: 在此处添加代码以启动应用程序
//
smartarrylist testlist=new smartarrylist();



Item test1=new Item("test1");
Item test2=new Item("test2");
Item test3=new Item("test3");
Item test4=new Item("test4");

testlist.additem(test1);
testlist.additem(test2);
testlist.additem(test3);
testlist.additem(test4);

testlist.dump();

test1=null;
test3=null;
testlist.dump();

}
}
}

输出结果:
test1
test2
test3
test4
test2
test4

帅帅123321 2004-04-05
  • 打赏
  • 举报
回复
我建议在对象里加一个属性。属性设置成静态。。。一切OK
helloparker 2004-04-03
  • 打赏
  • 举报
回复
觉得自己维护引用次数的话,总需要用户显式的通知容器添加引用活着取消引用,
如果使用remoting那样的生命周期管理形式可行吗?
Lostinet 2004-04-03
  • 打赏
  • 举报
回复
http://forum.lostinet.com/Topic.Aspx?TopicID=35&_lastreply=40
hyifeng 2004-04-03
  • 打赏
  • 举报
回复
噢,可以在获得对象引用数时触发一次扫描,这样不用为每个对象维护一个计数,
但如果频繁使用的话,效率很低。
hyifeng 2004-04-03
  • 打赏
  • 举报
回复
得到对象的引用计数很有用(例如实现对象池来提高效率),
但基本上很难。

GC面世,被吹捧到今时今日,现在又要消费者自己去使用AddRef(),Release()维护引用计数,实在搞笑之极,有失GC的风范。

GC现在不提供这个功能,可能将来也不会提供。

因为,即使是GC内部实现引用计数也不具备实时性。
不但要额外为每个对象维护一个计数,而且在每次清扫扫描时增加了很大的额外负担。

success_victory 2004-04-03
  • 打赏
  • 举报
回复
你可新建一类,专门管理对像,其余的类必须从此类来取的对象,此类就好比是一个简单类工厂,然后建立一个静态hashtable,使其的使用次数与类名产生一一映射的关系。
dicman 2004-04-03
  • 打赏
  • 举报
回复
类中加一静态变量,引用的时候+1,不过怎样知道什么时候释放呢?我也弄不懂:(
shanhe 2004-04-03
  • 打赏
  • 举报
回复
那实际上是要同GC取得联系,因为这个问题GC最关心
CMIC 2004-04-02
  • 打赏
  • 举报
回复
在类里加一个静态属性,记录类实例次数。
zzzl 2004-04-02
  • 打赏
  • 举报
回复
把arraylist封装起来,提供一个函数用来返回元素,调用时加1
这样就可以知道谁被引用几次了
juqiang 2004-04-02
  • 打赏
  • 举报
回复
如果你想实现缓存机制的话,就自己维护引用计数(增加/减少/释放等)。否则的话,GC就都帮你做了。
xinshaw 2004-04-01
  • 打赏
  • 举报
回复
同意用静态计数器,不过感觉你的需求很怪
helloparker 2004-04-01
  • 打赏
  • 举报
回复
我也想过其他办法啊,可是,始终有这样或者那样的缺陷,比如要做一个类似java cmp那样的东东,应该什么时候释放对象比较好呢?
Ninputer 2004-03-31
  • 打赏
  • 举报
回复
对于现有对象,没有办法知道
加载更多回复(7)

17,740

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧