`我需要知道來自程序完全不同部分的兩個引用是否指向同一個對象。 我無法比較引用programaticaly,因爲它們來自不同的上下文(一個引用不可見從另一個,反之亦然)。如何打印對象ID?
然後我想打印使用Console.WriteLine()
每個對象的唯一標識符。但ToString()
方法不返回「唯一」標識符,它只是返回「classname」。
是否可以在C#中打印唯一標識符(如在Java中)?
`我需要知道來自程序完全不同部分的兩個引用是否指向同一個對象。 我無法比較引用programaticaly,因爲它們來自不同的上下文(一個引用不可見從另一個,反之亦然)。如何打印對象ID?
然後我想打印使用Console.WriteLine()
每個對象的唯一標識符。但ToString()
方法不返回「唯一」標識符,它只是返回「classname」。
是否可以在C#中打印唯一標識符(如在Java中)?
最接近你可以很容易地得到(它不會受到GC移動物體等)的影響可能是RuntimeHelpers.GetHashCode(Object)。這給出了通過在對象上非虛擬地調用Object.GetHashCode()
返回的散列碼將。儘管如此,這仍然是而不是的唯一標識符。對於診斷目的來說,這可能已經足夠了,但是你不應該依靠它來進行生產比較。
編輯:如果這只是診斷,你可以添加一種「規範化ID生成器」,這只是一個List<object>
...當你問一個對象的「ID」,你會檢查它是否已經存在該列表(通過比較引用),然後將其添加到結尾(如果沒有)。該ID將成爲列表中的索引。當然,在不引入內存泄漏的情況下這樣做會涉及到弱引用等問題,但作爲一個簡單的破解,這可能對您有用。
Blindy的回答不正確?這個問題不是沒有爭議嗎? – 2011-04-18 14:17:28
@Adam:查看我對Blindy的回答的評論。只是基於這個問題進行猜測,但是它有一定的意義。 – 2011-04-18 14:21:30
啊 - 這很有道理。謝謝喬恩。 – 2011-04-18 14:22:43
一個參考是不是從另一個可見的,反之亦然
我不買。如果你甚至無法拿到手柄,你會如何得到他們的ID?
在C#中,您總是可以獲取對象的句柄,並且可以隨時比較它們。即使你必須使用反射來做到這一點。
我懷疑你是否缺少OP如何診斷問題......在某個時間點打印出一些描述的對象引用,然後打印出另一個描述,然後直觀地比較它們。在這個過程中,任何一段代碼都不能同時訪問兩個引用。無論如何,這是我的猜測。 – 2011-04-18 14:19:41
@Jon,如果這是他的意圖,他總是可以將它們添加到「全局」列表中,並在某個時間點用「object.Equals」檢查列表內容。但我承認,我沒有想到他的問題的任何實際應用<。< – Blindy 2011-04-18 14:26:37
是 - 這是我的編輯基本上建議:) – 2011-04-18 14:29:02
我認爲你打電話ToString
在你的object
參考,但不完全清楚在這個或你解釋的情況,TBH,所以只是忍耐與我。
該類型是否顯示ID
屬性?如果是的話,試試這個:
var idAsString = yourObjectInstance.ID.ToString();
或者,直接打印:
Console.WriteLine(yourObjectInstance.ID);
編輯:
我看到喬恩的權利,通過這個問題看出來了,讓我的答案看起來相當天真 - 無論如何,如果沒有別的辦法,我會留下來,以強調問題的不清晰。並且,也許,根據Jon的陳述,如果您決定通過標識符公開您自己的唯一性,則可以根據Jon的陳述提供一條途徑,以便'This [GetHashCode
]仍然不是唯一標識符'。
你可以給一個用例,這是有道理的嗎?試圖比較沒有參考的對象是沒有意義的。 – Tejs 2011-04-18 14:05:11