104
|
Martin Konicek Phil Windley · 技术社区 · 15 年前 |
1
76
仅限.NET 4及更高版本各位,好消息!
用于此工作的完美工具是.NET4中内置的,它被称为
|
2
46
|
3
45
参考文献 是 weak references (以避免阻止垃圾回收)从对您选择的ID(GUID、整数等)的引用中删除。然而,这将增加一定的开销和复杂性。 |
5
7
你可以在一秒钟内开发出你自己的东西。例如:
您可以选择自己想要的唯一ID,例如System.Guid.NewGuid()或integer,以实现最快的访问。 |
6
7
将第一个对象中的字段设置为新值。如果第二个对象中的同一字段具有相同的值,则可能是同一实例。否则,按不同的方式退出。
不要忘记在退出时将第一个对象中的字段设置回其原始值。 问题? |
7
5
从上下文菜单中。
|
8
4
您必须自己手动分配这样一个标识符——在实例内部或外部。
对于与数据库相关的记录,主键可能很有用(但仍然可以获得重复项)。或者,使用
|
9
2
我知道这已经得到了回答,但至少值得注意的是,您可以使用: http://msdn.microsoft.com/en-us/library/system.object.referenceequals.aspx
|
10
1
我在这里提供的信息不是新的,我只是为了完整性添加了这个。 此代码的思想非常简单:
要使用它,请创建
补遗
所以,这里还有更多的事情要做;让我写一点关于
好奇的是不是?毕竟,当GC收集对象时,它会检查是否有对该对象的引用,如果有,它会收集它们。所以如果有一个物体从
因此,在这一点上有两个问题需要解决。首先,对象可以在堆上移动,那么我们将使用什么作为IntPtr呢?第二,我们如何知道对象具有活动引用?
最后一个解决方案确实要求运行时在显式释放列表存储桶之前不重用它们,并且还要求通过调用运行时检索所有对象。 如果我们假设他们使用这个解决方案,我们还可以解决第二个问题。马克,;扫描算法跟踪已收集的对象;一旦收集到,我们就知道了。一旦对象检查对象是否存在,它将调用“Free”,这将删除指针和列表项。物体真的不见了。
在这一点上需要注意的一件重要事情是,如果
另一件需要注意的事情是,清理条目必须偶尔进行一次。虽然GC将清理实际对象,但不会清理条目。这就是为什么
我相信这也是原因
剩下的是让你玩弄这些机制,这样你就可以看到实际的依赖性了。确保多次启动并观察结果:
|
11
1
如果您正在用自己的代码编写一个模块以用于特定用途, majkinetor's method 可以 我已经成功了。但也存在一些问题。
不
,假设您有非常少量的对象
因此,这种方法有很大的局限性。 和 甚至更多 ,如果您想建立一个通用库,该怎么办? 您不仅不能修改所用类的源代码,而且它们的行为也是不可预测的。 我很感激 Jon 和 Simon 我已经发布了他们的答案,我将在下面发布一个代码示例和一个关于性能的建议。
在我的测试中
此外,基准结果是
|
astef · 为没有字段的值对象重写GetHashCode() 10 年前 |