用于存储引用类型的C#引用集合

时间:2010-12-31 08:46:24

标签: c# collections pass-by-reference

我喜欢实现一个集合(类似List<T>),它可以保存我在应用程序的整个生命周期中创建的所有我的对象,就像它的指针数组一样在C ++中。我的想法是,当我的流程开始时,我可以使用中央工厂来创建所有对象,然后定期验证/使其状态无效。基本上我想确保我的进程只处理有效的实例,而且我不会重新获取我已经从数据库中获取的信息。所以我的所有物品基本上都在一个地方 - 我的收藏品。我可以做的一件很酷的事情就是避免数据库调用从数据库中获取数据(如果我已经得到它)(即使我在检索后仍然更新它仍然是最新的,如果当然其他一些进程没有更新但是那个不同的问题)。如果我在过去的某个时候已经启动了James Thomas,我不想再次致电new Customer("James Thomas");。目前,我将在appdomain中找到同一对象的多个副本 - 有些同步不同步,即使我使用MSSQL服务器上的timestamp字段处理此问题,我只想保留一个副本我的appdomain中的每个客户(如果可能的话,过程会更好)。

我不能使用像List或ArrayList这样的常规集合,因为我不能通过它们对我们使用ref创建它们的现有Add()方法的实际本地引用传递参数,所以这不是好,我想。那么如何实现/可以实现呢? “链接列表”类型,所有方法都使用ref&amp; out params是我现在的想法,但它可能会很快变得丑陋。还有其他方法可以实现像RefList<T>.Add(ref T obj)这样的集合吗?

所以底线是:如果我之前已经在整个应用程序生命周期中创建了一个对象,我不想重新创建一个对象,除非我决定明确地重新创建它(可能是它已过时或者某些东西)所以我必须从db中再次获取它。有替代品吗?

2 个答案:

答案 0 :(得分:3)

执行您要完成的任务的最简单方法是创建一个保留在列表中的包装器。这个包装器将有一个add方法,它接受ref。在添加中,它会查找列表中的值,并在找不到值时创建它。或缓存

但......这句话让我担心。

  

我不想重新创建一个对象if   我之前已经创建了它   整个应用寿命

但Raymond Chen指出A cache with a bad policy is another name for a memory leak。您所描述的是没有政策的缓存

要解决此问题,您应该考虑使用非Web应用程序System.Runtime.Caching for 4.0或3.5及更早Enterprise Library Caching Block。如果这是一个Web应用程序,那么您可以使用System.Web.Caching。或者,如果你必须自己动手,至少要制定合理的政策。

所有这些当然都假定您的数据库缓存不足。

答案 1 :(得分:0)

使用Ioc可以为您节省许多错误,并使您的应用程序更容易测试,并且您的模块将更少耦合。 Ioc表现非常好。 我建议你使用Castle项目的实现 http://stw.castleproject.org/Windsor.MainPage.ashx

也许你需要一天的时间来学习它,但它很棒。