上面的例中,當打斷點調試時,斷點斷住時, Attr1屬性的get塊就會執行一次。 兩個斷點加在邏輯中對Attr1的訪問,最後發現CTest get Attr1.列印了3次。 得到的結論是:多餘的2次列印是由於斷點使得程式中斷引發的,中斷後調試器需要獲取Attr1的數值,對get塊進行調用。 不調試直 ...
上面的例中,當打斷點調試時,斷點斷住時, Attr1屬性的get塊就會執行一次。
兩個斷點加在邏輯中對Attr1的訪問,最後發現CTest get Attr1.列印了3次。
得到的結論是:多餘的2次列印是由於斷點使得程式中斷引發的,中斷後調試器需要獲取Attr1的數值,對get塊進行調用。
不調試直接運行程式,發現只列印1次CTest get Attr1. 與預期相符!
這是調試器引發的海森伯效應。調試狀態下,Attr1的get邏輯被執行n次。
所幸,vs2008提供了調試選項來關閉調試器的這種行為:去掉Enable property evaluation and other implicit function calls的勾選
去掉這個勾選後,我們還是和上面代碼一樣放置2個斷點,調試執行到第2個斷點,這時就只列印了1次CTest get Attr1. 與預期相符!
但是我們把滑鼠放在o變數上對其成員進行查看時,就沒法直接看到Attr1的值了
我們繼續點擊Attr1後面的刷新圖標,這時就可以看到Attr1的數值了,同時看到控制台視窗上又列印了1次CTest get Attr1.