在运行时唯一标识对象的选项?

Mic*_*l J 5 c# performancecounter

我需要在运行时将唯一标识符附加到对象.标识符在应用程序期间必须是唯一的.我计划在我的对象模型的基类中有一个私有成员变量.此变量将在对象初始化时设置,并且该值将在对象的生命周期内保持不变.在应用程序的持续时间内,没有其他对象可以具有相同的标识符.

当然,我可以使用System.Guid,但每个对象需要128位存储空间,而且我希望消耗更少的资源.我尝试使用Int32并使用System.Environment.TickCount属性对其进行初始化,但是我得不到足够的分辨率,并且某些对象最终会分配相同的值.

TickCounter的文档说,TickCount属性将在~29之后滚动到负值,然后在另外29天内回到零.随着时间的推移,我会很乐意交换更多的分辨率.

我还有其他我不了解的选择吗?

Ree*_*sey 13

我建议使用整数值,并在赋值时自动递增.您可以使用Interlocked.Increment使此操作线程安全.

最有可能的是,32位整数对于此任务来说足够大.我建议像这样:

private static newObjectId = int.MinValue;

private static int GetNextId()
{
    return Interlocked.Increment(ref newObjectId);
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以在基类中使用它来分配新的唯一标识符.


Eri*_*ert 9

要为对象生成唯一ID,您可以使用我们为您方便地提供的恰当命名的ObjectIDGenerator:

http://msdn.microsoft.com/en-us/library/system.runtime.serialization.objectidgenerator.aspx

请注意,正如注释所指出的,对象id生成器保持对对象的引用,因此它仅适用于您知道将在应用程序的生命周期中存活的对象.如果你打算在更短暂的物体上使用这个东西,那么这不是一个好的解决方案.

您可以构建自己的对象ID生成器,如果您愿意,可以保留弱引用; 这不会那么困难.

  • 有趣.doc说,ObjectIDGenerator打算在创建它的Formatter的生命周期中用于序列化,它通过维护ID和对象地址之间的关系来工作.从描述中不清楚ObjectIDGenerator对对象的引用是否会阻止对象的垃圾收集.您是否知道这是否使用弱引用,或者在程序的生命周期内使用它是否可能是内存泄漏的来源? (2认同)