3 回答
TA贡献1851条经验 获得超3个赞
代替此代码,您应该调用GetHashCode(),它将为每个实例返回一个(希望的)唯一值。
您也可以使用ObjectIDGeneratorclass,它保证是唯一的。
TA贡献1772条经验 获得超5个赞
如果您确实不需要内存地址,而是需要一些方法来唯一标识托管对象,则有更好的解决方案:
using System.Runtime.CompilerServices;
public static class Extensions
{
private static readonly ConditionalWeakTable<object, RefId> _ids = new ConditionalWeakTable<object, RefId>();
public static Guid GetRefId<T>(this T obj) where T: class
{
if (obj == null)
return default(Guid);
return _ids.GetOrCreateValue(obj).Id;
}
private class RefId
{
public Guid Id { get; } = Guid.NewGuid();
}
}
这是线程安全的,并且在内部使用弱引用,因此不会有内存泄漏。
您可以使用任何您喜欢的密钥生成方式。我在Guid.NewGuid()这里使用它是因为它简单且线程安全。
更新资料
我继续创建了一个Nuget包Overby.Extensions.Attachments,其中包含一些用于将对象附加到其他对象的扩展方法。有一个扩展名为GetReferenceId(),可以有效地执行此答案中的代码显示的内容。
- 3 回答
- 0 关注
- 1401 浏览
添加回答
举报