2011-04-18 118 views
6

`我需要知道來自程序完全不同部分的兩個引用是否指向同一個對象。 我無法比較引用programaticaly,因爲它們來自不同的上下文(一個引用不可見從另一個,反之亦然)。如何打印對象ID?

然後我想打印使用Console.WriteLine()每個對象的唯一標識符。但ToString()方法不返回「唯一」標識符,它只是返回「classname」。

是否可以在C#中打印唯一標識符(如在Java中)?

+1

你可以給一個用例,這是有道理的嗎?試圖比較沒有參考的對象是沒有意義的。 – Tejs 2011-04-18 14:05:11

回答

16

最接近你可以很容易地得到(它不會受到GC移動物體等)的影響可能是RuntimeHelpers.GetHashCode(Object)。這給出了通過在對象上非虛擬地調用Object.GetHashCode()返回的散列碼。儘管如此,這仍然是而不是的唯一標識符。對於診斷目的來說,這可能已經足夠了,但是你不應該依靠它來進行生產比較。

編輯:如果這只是診斷,你可以添加一種「規範化ID生成器」,這只是一個List<object> ...當你問一個對象的「ID」,你會檢查它是否已經存在該列表(通過比較引用),然後將其添加到結尾(如果沒有)。該ID將成爲列表中的索引。當然,在不引入內存泄漏的情況下這樣做會涉及到弱引用等問題,但作爲一個簡單的破解,這可能對您有用。

+0

Blindy的回答不正確?這個問題不是沒有爭議嗎? – 2011-04-18 14:17:28

+0

@Adam:查看我對Blindy的回答的評論。只是基於這個問題進行猜測,但是它有一定的意義。 – 2011-04-18 14:21:30

+0

啊 - 這很有道理。謝謝喬恩。 – 2011-04-18 14:22:43

2

一個參考是不是從另一個可見的,反之亦然

我不買。如果你甚至無法拿到手柄,你會如何得到他們的ID?

在C#中,您總是可以獲取對象的句柄,並且可以隨時比較它們。即使你必須使用反射來做到這一點。

+1

我懷疑你是否缺少OP如何診斷問題......在某個時間點打印出一些描述的對象引用,然後打印出另一個描述,然後直觀地比較它們。在這個過程中,任何一段代碼都不能同時訪問兩個引用。無論如何,這是我的猜測。 – 2011-04-18 14:19:41

+0

@Jon,如果這是他的意圖,他總是可以將它們添加到「全局」列表中,並在某個時間點用「object.Equals」檢查列表內容。但我承認,我沒有想到他的問題的任何實際應用<。< – Blindy 2011-04-18 14:26:37

+0

是 - 這是我的編輯基本上建議:) – 2011-04-18 14:29:02

0

我認爲你打電話ToString在你的object參考,但不完全清楚在這個或你解釋的情況,TBH,所以只是忍耐與我。

該類型是否顯示ID屬性?如果是的話,試試這個:

var idAsString = yourObjectInstance.ID.ToString(); 

或者,直接打印:

Console.WriteLine(yourObjectInstance.ID); 

編輯:

我看到喬恩的權利,通過這個問題看出來了,讓我的答案看起來相當天真 - 無論如何,如果沒有別的辦法,我會留下來,以強調問題的不清晰。並且,也許,根據Jon的陳述,如果您決定通過標識符公開您自己的唯一性,則可以根據Jon的陳述提供一條途徑,以便'This [GetHashCode]仍然不是唯一標識符'

1

如果你需要知道兩個引用是否指向同一個對象,我只需要引用this

默認情況下,運算符==測試 引用等式。這由 完成確定兩個參考是否指示 相同的對象。因此參考 類型不需要執行 運算符==爲了獲得這個 功能。

因此,==運算符將不做Id解決方法。

+2

「我不能比較引用programaticaly」 – 2011-04-18 14:06:20

+0

然後我的答案是「否這是不可能的「除非你創建一個GUID的CustomId並比較這些GUID。或者在這裏告訴你GetHashCode()方法。 – apacay 2011-04-18 14:15:11