如何在C#中運行時更改變量的值?我對調試器在通過執行步驟跟蹤變量時提供的功能感興趣,只是需要從我的代碼中調用它。某種鍵值觀察,但對於各種變量(本地,類,靜態等),不僅屬性。所以,基本上,當變量的值發生變化時會收到通知。如何在C#中運行時跟蹤變量?
回答
您正在從調試器可以跟蹤變量更改的假設開始工作。它不能。
對於非託管代碼,處理器有專用的調試寄存器可以設置數據斷點。最多提供三個。它在看到特定內存位置被寫入時產生硬件中斷。然而,這個非常有用的功能在託管代碼中不可用。垃圾收集器與它完全不兼容,它會移動物體,給他們另一個地址。
託管調試器在斷點上確實支持「何時命中」條件,允許您將信息轉儲到輸出窗口。然而,這需要一個斷點,它不能由變量值的變化觸發。它也真的減緩代碼執行,因爲在執行條件之前調試器實際上進入休息狀態。
放置這樣一個斷點的顯而易見的地方是屬性設置器。這是你需要在代碼中實現這個功能。您可以在該設置器中執行任何您想要的操作,例如使用Trace類。
+ +1作爲答案,但我有點不同意一個簡單的條件斷點放緩的點。由於C#被轉換爲字節碼,對於調試器來說,最恰當的方式就是創建並插入一個字節碼,該字節碼將在值的位置處打印一個值。我沒有看到爲什麼不能以這種方式完成它的原因 - 因此我調用了一個性能錯誤的調試器斷點的另一個實現。 – 2015-05-14 08:06:50
不,C#被轉換爲機器碼,IL只是一箇中間步驟。使用Debug> Windows> Disassembly來查看它。功能,而不是一個錯誤。 – 2015-05-14 08:19:00
你能做到這沒有調試器將是唯一明智的方法:不使用變量,但是使用屬性,以及(也許是有條件的)添加跟蹤到二傳手:
private int myValue;
public int MyValue {
get {return myValue;}
set {
SomeTraceMethod(myValue, value, ...);
myValue = value;
}
}
顯然這不能用於任意字段/變量。
調試器如何爲任意變量執行此操作?沒有一個調試庫可以幫助我達到同樣的跟蹤水平嗎? – luvieere 2010-05-26 11:18:44
要添加到Marc所說的內容中,如果您想要對許多屬性和方法執行此操作,您可能需要查看面向方面的編程技術以及諸如PostSharp之類的庫。
正如其他使用性質時,這樣做只能意會提到的機制。在.NET中,您可以使用INotifyPropertyChanged
界面。
對於樣品如何實現它看到
明確有關Windows窗體引用的文章會談,但你是不是綁定到(該接口在實際聲明System.dll中的System.ComponentModel
命名空間)。實際上,該接口廣泛用於數據綁定場景,例如在WPF中。
我在問題中提到我對任意變量感興趣,而不是屬性。我知道INotifyPropertyChanged,我不知道如何跟蹤任意變量,就像調試器一樣。 – luvieere 2010-05-26 12:04:30
託管調試器幾乎所有的東西都使用了COM API的ICorDebug
。你感興趣的部分是ICorDebugValue
及其後代。請注意,很多調試API要求進程不運行(即遇到斷點),以便進行各種檢查。ICorDebug
的高層次概述是here。它的文檔有點稀疏,但一些谷歌搜索可能會有所幫助。祝你好運。
- 1. 如何在運行時跟蹤(flex)
- 2. 如何跟蹤變量?
- 3. 如何在Logicblox中跟蹤運行?
- 4. 跟蹤行號的變量
- 5. 如何在Firefox中運行時訪問JavaScript執行跟蹤?
- 6. 如何在C++/CLI中模擬成員引用跟蹤變量?
- 7. 跟蹤變量訪問(c/C++)?
- 8. 如何在Eclipse中跟蹤JRE時觀察變量?
- 9. 如何在Xcode 4 Debugger中實時跟蹤變量值?
- 10. 跟蹤xquery變量
- 11. 跟蹤與變量
- 12. 如何跟蹤腳本成功運行或超時在PHP中
- 13. Postharp在運行時跟蹤開/關?
- 14. 如何跟蹤在C
- 15. 如何紅寶石跟蹤變量
- 16. Python,如何跟蹤全局變量
- 17. 如何跟蹤4000行代碼過程中使用的變量?
- 18. C#在運行時啓用/禁用網絡跟蹤?
- 19. 如何在運行時跟蹤Dsl/DslPackage(Visual Studio VS2012)
- 20. C#跟蹤鼠標運動
- 21. 如何在Android中跟蹤C線程?
- 22. as3跟蹤變量數值
- 23. Ruby跟蹤實例變量
- 24. C++如何跟蹤局部變量/對象
- 25. 如何跟蹤C++ GNU xgettex執行?
- 26. 運行時對象參考跟蹤
- 27. 如何在Eclipse Java調試器中跟蹤變量的值
- 28. 如何在Perl中跟蹤全局變量?
- 29. 如何在運行時跟蹤DataGridView中的cellblick事件在vb.net中
- 30. 跟蹤器自動運行
爲什麼調試器不是一個選項?這正是它的目的。 – 2010-05-26 10:49:53
@ 0xA3因爲我需要在運行時從應用程序中訪問這些值,只能在它們更改時訪問這些值。 – luvieere 2010-05-26 10:53:38
如何將變量的變化值寫入一個簡單的日誌文件。 – Shivam 2010-05-26 12:34:53