2010-08-25 47 views
8

我正在做一些C#.NET項目的診斷日誌記錄,我希望能夠記錄代表某個類的特定實例的標識符。我知道我可以用一個靜態變量來做到這一點,每次創建類實例時都會增加它,但我只是想知道在.NET框架中是否有任何內置方式來執行此操作。也許使用反射或什麼的。是否有內置的方法來識別類的實例?

+0

此問題的討論可能會對您有所幫助。 http://stackoverflow.com/questions/750947/net-unique-object-identifier – 2010-08-25 20:09:02

回答

5

我想補充一下Henk said in his answerGetHashCode,並減輕一些他對這個問題的答案收到的負面評價:

有一種方法叫GetHashCode任何對象,它是獨立於對象的價值,無論其類型是否已被覆蓋GetHashCode。請參考System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode

當然,這個值並不保證是唯一的。 Guid也不是(雖然不是是獨特的會涉及合法微觀的賠率)。

我想說你的直覺是對的靜態計數器變量。不過,我應該提到,僅僅在每個對象的構造函數中使用++運算符遞增它並不是線程安全的。如果可能的話,您可以實例化來自多個線程的類的實例,您可以改爲使用Interlocked.Increment

+0

有趣的鏈接。 – 2010-08-25 21:12:42

3

最接近的是GetHashCode(),但這並不保證是唯一的。儘管如此,它通常足以用於診斷。

我剛剛讀到這個similar question的答案。根據JS,第一次調用GethashCode時會有一個同步塊的開銷。這可能是一個問題。

+0

GetHashcode是否從實例更改爲實例?如果對象相等,它不應該改變。 – Zebi 2010-08-25 20:09:35

+2

使用相同值初始化的相同類的兩個實例必須返回相同的哈希碼,所以這根本不起作用。 – 2010-08-25 20:10:10

+1

@Jon B:對於覆蓋GethashCode()的某些類(如字符串),這只是真的。默認版本是System.Object的一部分,無法看到您的成員。嘗試一下。 – 2010-08-25 20:15:03

0

也許Object.ReferenceEquals解決了您的問題。至少它可以告訴你一個物體是否與其他物體相同。

您不能使用靜態變量,因爲它在每個實例中都是相同的。它只會創建對象的數量。

您可以使用Jon B的解決方案,或者如果您希望數字標識符使用靜態計數器並將ID分配給字段。

public class Foo 
{ 
    static int counter; 
    public int InstanceId; 

    public Foo() 
    { 
     InstanceId = counter++; 
    } 
} 
+0

我很確定你在最後一部分描述的正是OP所指的「靜態變量」(即'counter')。 – 2010-08-25 20:28:35

7

你可以一個Guid屬性添加到您的類的構造函數(爲每個實例保證是唯一的)對其進行初始化。

+2

使用此技術幾次。你可以直接初始化一個字段'public guid InstanceId = Guid.NewGuid();'讓你的構造函數清除調試內容。 – Zebi 2010-08-25 20:18:32

+0

這不比使用靜態計數器更容易或更方便。這在眼睛上要困難得多。 – 2010-08-25 20:21:30

+0

你會如何使用靜態計數器?由於它是靜態的,它在每個實例中都是相同的。我錯了嗎? – Zebi 2010-08-25 20:25:23

相關問題