我正在做一些C#.NET項目的診斷日誌記錄,我希望能夠記錄代表某個類的特定實例的標識符。我知道我可以用一個靜態變量來做到這一點,每次創建類實例時都會增加它,但我只是想知道在.NET框架中是否有任何內置方式來執行此操作。也許使用反射或什麼的。是否有內置的方法來識別類的實例?
回答
我想補充一下Henk said in his answer約GetHashCode
,並減輕一些他對這個問題的答案收到的負面評價:
有一種方法叫GetHashCode
上任何對象,它是獨立於對象的價值,無論其類型是否已被覆蓋GetHashCode
。請參考System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode
。
當然,這個值並不保證是唯一的。 Guid
也不是(雖然不是是獨特的會涉及合法微觀的賠率)。
我想說你的直覺是對的靜態計數器變量。不過,我應該提到,僅僅在每個對象的構造函數中使用++
運算符遞增它並不是線程安全的。如果可能的話,您可以實例化來自多個線程的類的實例,您可以改爲使用Interlocked.Increment
。
有趣的鏈接。 – 2010-08-25 21:12:42
最接近的是GetHashCode()
,但這並不保證是唯一的。儘管如此,它通常足以用於診斷。
我剛剛讀到這個similar question的答案。根據JS,第一次調用GethashCode時會有一個同步塊的開銷。這可能是一個問題。
GetHashcode是否從實例更改爲實例?如果對象相等,它不應該改變。 – Zebi 2010-08-25 20:09:35
使用相同值初始化的相同類的兩個實例必須返回相同的哈希碼,所以這根本不起作用。 – 2010-08-25 20:10:10
@Jon B:對於覆蓋GethashCode()的某些類(如字符串),這只是真的。默認版本是System.Object的一部分,無法看到您的成員。嘗試一下。 – 2010-08-25 20:15:03
也許Object.ReferenceEquals
解決了您的問題。至少它可以告訴你一個物體是否與其他物體相同。
您不能使用靜態變量,因爲它在每個實例中都是相同的。它只會創建對象的數量。
您可以使用Jon B的解決方案,或者如果您希望數字標識符使用靜態計數器並將ID分配給字段。
public class Foo
{
static int counter;
public int InstanceId;
public Foo()
{
InstanceId = counter++;
}
}
我很確定你在最後一部分描述的正是OP所指的「靜態變量」(即'counter')。 – 2010-08-25 20:28:35
- 1. 是否有任何方法來轉換實例的類型
- 2. 具有NSDate類別參數的類方法或實例方法?
- 3. 是否有任何方法來識別圖像的背景(室內或室外)
- 4. 是否有任何方法來確定變量是否包含MooTools類實例
- 5. 是否有任何內置的方式來自動強制在Ruby中的實例變量的類型/類?
- 6. 是否有編程方法來識別c#保留字?
- 7. 類的所有方法是否返回其實例的地址?
- 8. 正確的方法來查看超類的當前實例是否是超類內的子類
- 9. 是否有可能獲得方法內的調用實例?
- 10. 是否有內置的方法將Bootstrap類分組爲「元類」?
- 11. 是否有任何內置的方法來實現python 3.6中的'trees'?
- 12. 更好的方法來檢查對象是否是Java中類的實例
- 13. 是否有任何內置的圖像識別功能
- 14. iOS中是否有內置的語音識別開發工具?
- 15. 是否有內置的方法來增加字體大小?
- 16. 是否有方法可以方便地記住類的實例,類,對象
- 17. 是否有一個實現的說話人識別算法
- 18. Tkinter:__init__中的實例無法識別
- 19. 實例方法中的內部類
- 20. 內部類方法與Java中的實例方法之間的區別
- 21. 無法識別的選擇發送到實例 - 方法存在
- 22. 以不同的方式聲明繼承類的實例是否有區別?
- 23. 是否有可能在Ruby中識別別名方法?
- 24. 類方法是否會增加類實例的大小?
- 25. 是否有任何方法來識別文本中的代碼片段
- 26. 是否有ReSharper快捷方式來查找某種類型的所有實例?
- 27. 是否有內置的方法來檢查IP地址是否已被佔用?
- 28. 在沒有示例實例的情況下,scala中是否有方法來生成一個通用實例?
- 29. 如何使用反射來識別java方法是否通用?
- 30. 有沒有一種方法來識別platform.resume事件是否被相機調用?
此問題的討論可能會對您有所幫助。 http://stackoverflow.com/questions/750947/net-unique-object-identifier – 2010-08-25 20:09:02