3 回答

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

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