3 回答

TA貢獻(xiàn)1851條經(jīng)驗 獲得超3個贊
代替此代碼,您應(yīng)該調(diào)用GetHashCode(),它將為每個實例返回一個(希望的)唯一值。
您也可以使用ObjectIDGeneratorclass,它保證是唯一的。

TA貢獻(xiàn)1772條經(jīng)驗 獲得超5個贊
如果您確實不需要內(nèi)存地址,而是需要一些方法來唯一標(biāo)識托管對象,則有更好的解決方案:
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();
}
}
這是線程安全的,并且在內(nèi)部使用弱引用,因此不會有內(nèi)存泄漏。
您可以使用任何您喜歡的密鑰生成方式。我在Guid.NewGuid()這里使用它是因為它簡單且線程安全。
更新資料
我繼續(xù)創(chuàng)建了一個Nuget包Overby.Extensions.Attachments,其中包含一些用于將對象附加到其他對象的擴展方法。有一個擴展名為GetReferenceId(),可以有效地執(zhí)行此答案中的代碼顯示的內(nèi)容。
- 3 回答
- 0 關(guān)注
- 1437 瀏覽
添加回答
舉報