2010-08-30 64 views
19

在Visual Studio 2010中,是否有可能打破改變對象屬性的任何東西(例如方法)?Visual Studio 2010 - 打破任何改變對象屬性的東西

或者有可能找出對象屬性是否在ASP.NET Webforms應用程序中更改?


更新:

正確答案,可以發現:http://stackoverflow.com/questions/2682613/cant-set-breakpoints-on-an-auto-property-setter-why/6713920#6713920

+1

你在說什麼房產?內置於其中一個標準控件的屬性?或者您自己的控件中的一個屬性? – slugster 2010-08-30 12:20:32

+0

屬於我自己的POCO – Rookian 2010-08-30 12:43:39

回答

13

如果你可以控制聲明屬性的代碼,那麼當然你可以在setter中放置一個斷點。即使是目前一個自動實現的屬性,如:

public string SomeProperty { get; set; } 

,你可以很容易地改變這樣的:

private string _someProperty; 
public string SomeProperty { 
    get { return _someProperty; } 
    set { 
     // Set breakpoint here, or type Debugger.Break(); 
     _someProperty = value; 
    } 
} 

如果該值實際上是代替財產 ,您仍然可以將其更改爲屬性以實現相同的目的。

如果您無權訪問聲明該屬性的代碼,那麼這會比較困難。就個人而言我要做的就是這一點,但它是一個有點費力:

  1. Program類聲明的屬性類型的聲明一個公共靜態字段。

  2. 在程序早期,找到對其屬性值更改的對象的引用,並將該引用放置在此靜態字段中。如有必要,請使用反射來檢索專用字段。在調試時將global::MyNamespace.Program.MyField.ImportantProperty添加到監視窗口。

  3. 逐步瀏覽代碼,直到觀察窗口中的值發生變化。

+2

要在自動實現的屬性上設置斷點,請參閱我的回答:http://stackoverflow.com/questions/2682613/cant-set-breakpoints-on-an-auto-property- setter-why/6713920#6713920 – 2011-07-15 22:45:40

-5

您可以使用它的目的System.Diagnoistic.Debugger.Break()方法如下

if(x!= y) 
    Debugger.Break() 
2

右鍵單擊表示斷點的紅點 - 選擇Condition,然後輸入表達式希望斷點破壞執行,或者檢查Has changed在值更改時中斷。

3

這聽起來像你問這將導致Visual Studio打破每當一個屬性/字段的對象上改變的特徵。

對於屬性,你可以用正常的斷點和條件來做到這一點。只需在屬性設置器上設置斷點,右鍵單擊並選擇條件。然後添加一個簡單的檢查,看看新值和現有值是不同的

value != backingField 

對於領域真的沒有好的解決方案。 C++調試器有一個名爲Data BreakPoints的特性,它恰好具有這種行爲。但它們不適用於託管語言,主要是因爲CLR調試器不支持它們。您可以做的最好的做法是暫時將您的字段更改爲屬性並使用上述方法。

1

我不認爲在VS IDE中有一種方法可以讓你設置一個通用的斷點。如果你真的需要這個並且願意做一些代碼修改,你可以看看partial methods。使用部分方法,您可以定義一個部分方法並從您的setters中調用它。當您想要調試以查明誰在調用setter時,可以提供partial方法的虛擬實現。當你完成調試時,你可以擺脫實現,編譯器不會生成與該方法相關的任何東西,就好像它不存在一樣。這會污染您的代碼,除非您可以考慮其他潛在用戶對部分方法調用的使用。不過,我只是想把它扔出去,讓你知道。

+0

+1有趣。我從來沒有想過用這種方法使用部分方法。 – Dan 2012-03-29 16:39:17