2010-05-26 24 views
5

如何在C#中運行時更改變量的值?我對調試器在通過執行步驟跟蹤變量時提供的功能感興趣,只是需要從我的代碼中調用它。某種鍵值觀察,但對於各種變量(本地,類,靜態等),不僅屬性。所以,基本上,當變量的值發生變化時會收到通知。如何在C#中運行時跟蹤變量?

+0

爲什麼調試器不是一個選項?這正是它的目的。 – 2010-05-26 10:49:53

+0

@ 0xA3因爲我需要在運行時從應用程序中訪問這些值,只能在它們更改時訪問這些值。 – luvieere 2010-05-26 10:53:38

+0

如何將變量的變化值寫入一個簡單的日誌文件。 – Shivam 2010-05-26 12:34:53

回答

3

您正在從調試器可以跟蹤變量更改的假設開始工作。它不能。

對於非託管代碼,處理器有專用的調試寄存器可以設置數據斷點。最多提供三個。它在看到特定內存位置被寫入時產生硬件中斷。然而,這個非常有用的功能在託管代碼中不可用。垃圾收集器與它完全不兼容,它會移動物體,給他們另一個地址。

託管調試器在斷點上確實支持「何時命中」條件,允許您將信息轉儲到輸出窗口。然而,這需要一個斷點,它不能由變量值的變化觸發。它也真的減緩代碼執行,因爲在執行條件之前調試器實際上進入休息狀態。

放置這樣一個斷點的顯而易見的地方是屬性設置器。這是你需要在代碼中實現這個功能。您可以在該設置器中執行任何您想要的操作,例如使用Trace類。

+0

+ +1作爲答案,但我有點不同意一個簡單的條件斷點放緩的點。由於C#被轉換爲字節碼,對於調試器來說,最恰當的方式就是創建並插入一個字節碼,該字節碼將在值的位置處打印一個值。我沒有看到爲什麼不能以這種方式完成它的原因 - 因此我調用了一個性能錯誤的調試器斷點的另一個實現。 – 2015-05-14 08:06:50

+2

不,C#被轉換爲機器碼,IL只是一箇中間步驟。使用Debug> Windows> Disassembly來查看它。功能,而不是一個錯誤。 – 2015-05-14 08:19:00

0

你能做到這沒有調試器將是唯一明智的方法:不使用變量,但是使用屬性,以及(也許是有條件的)添加跟蹤到二傳手:

private int myValue; 
public int MyValue { 
    get {return myValue;} 
    set { 
     SomeTraceMethod(myValue, value, ...); 
     myValue = value; 
    } 
} 

顯然這不能用於任意字段/變量。

+0

調試器如何爲任意變量執行此操作?沒有一個調試庫可以幫助我達到同樣的跟蹤水平嗎? – luvieere 2010-05-26 11:18:44

0

正如其他使用性質時,這樣做只能意會提到的機制。在.NET中,您可以使用INotifyPropertyChanged界面。

對於樣品如何實現它看到

How to: Implement the INotifyPropertyChanged Interface

明確有關Windows窗體引用的文章會談,但你是不是綁定到(該接口在實際聲明System.dll中的System.ComponentModel命名空間)。實際上,該接口廣泛用於數據綁定場景,例如在WPF中。

+0

我在問題中提到我對任意變量感興趣,而不是屬性。我知道INotifyPropertyChanged,我不知道如何跟蹤任意變量,就像調試器一樣。 – luvieere 2010-05-26 12:04:30

1

託管調試器幾乎所有的東西都使用了COM API的ICorDebug。你感興趣的部分是ICorDebugValue及其後代。請注意,很多調試API要求進程不運行(即遇到斷點),以便進行各種檢查。ICorDebug的高層次概述是here。它的文檔有點稀疏,但一些谷歌搜索可能會有所幫助。祝你好運。