第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C#中對象的內(nèi)存地址

C#中對象的內(nèi)存地址

波斯汪 2019-10-18 10:14:01
我前段時間編寫了一個函數(shù)(針對.NET 3.5),現(xiàn)在我已升級到4.0我無法正常工作。該函數(shù)是:public static class MemoryAddress{    public static string Get(object a)    {        GCHandle handle = GCHandle.Alloc(a, GCHandleType.Pinned);        IntPtr pointer = GCHandle.ToIntPtr(handle);        handle.Free();        return "0x" + pointer.ToString("X");    }}現(xiàn)在,當(dāng)我調(diào)用它時-MemoryAddress.Get(new Car(“ blue”))public class Car{    public string Color;    public Car(string color)    {        Color = color;    }}我得到錯誤:對象包含非原始或不可復(fù)制的數(shù)據(jù)。為什么它不起作用了?現(xiàn)在如何獲取被管理對象的內(nèi)存地址?
查看完整描述

3 回答

?
皈依舞

TA貢獻(xiàn)1851條經(jīng)驗 獲得超3個贊

代替此代碼,您應(yīng)該調(diào)用GetHashCode(),它將為每個實例返回一個(希望的)唯一值。


您也可以使用ObjectIDGeneratorclass,它保證是唯一的。


查看完整回答
反對 回復(fù) 2019-10-18
?
月關(guān)寶盒

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)容。


查看完整回答
反對 回復(fù) 2019-10-18
  • 3 回答
  • 0 關(guān)注
  • 1437 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號