2010-06-28 84 views
0

我有一個字符串變量和一個字符串常量。兩者應該是相同的價值(我在條件測試平等)。兩者的「正確」值應該是「scl」。在調試的時候,如果我在每個地方都放一個手錶,在'本地人'的窗口中查看它們,或者將鼠標懸停在它們上面,顯示的值是「sd」,這是類中不同常量的值(還有很多其他常量和類中正在顯示值的變量)。如果我爲所討論的變量/常數值插入一個Debug.WriteLine(與手錶的範圍相同),輸出窗口會打印出每個值的正確值。對於我的生活,我無法弄清楚爲什麼會發生這種情況,或者如何糾正它。爲什麼我的VS2008手錶顯示不正確的值?

+0

你可能已經試過了,但我的第一個想法是,你有沒有嘗試重新啓動VS? – 2010-06-28 18:46:54

+0

聽起來像你需要清理和重建你的項目。一些調試信息聽起來不對。 – 2010-06-28 18:47:04

+0

已經做到了。但謝謝你的建議。 – 2010-06-28 18:47:55

回答

0

它是一個懶加載的屬性?我在我做了這樣的事情過去有問題,像這樣的(可怕的人爲的例子,但它會做)

public ClassWithMoo 
{ 
    private string moo; 

    public string Moo 
    { 
     get 
     { 
     if (String.IsNullOrEmpty(this.moo)) this.moo = "Baa"; 
     return this.moo; 
     } 
     set 
     { 
     this.moo = value; 
     } 
    } 
} 

public ClassThatUsesMoo 
{ 
    ClassWithMoo cow = new ClassWithMoo(); 

    // breakpoint here would show cow.Moo = "Baa" 
    // This is because the debugger/watch window will instantiate the property! 

    someCodeHere(); 

    cow.Moo = "Moo"; 
    debug.WriteLine(cow.Moo); // outputs 'Moo' now that it has been set properly 
} 
+0

這是有道理的。然而,沒有這樣的事情正在完成。此外,其中一個錯誤值是不變的,所以將常數重新分配到合適的值是不可能的。 – 2010-06-28 19:16:14

1

我似乎通過改變常量的值已經固定它,跑一個調試會話,然後將其值改回原來的值。也許這清除了某種調試緩存。

感謝您的幫助!

+2

我想我知道發生了什麼事。一個常量的語義應該是*值*常數* *永恆*。編譯器假定即使在程序集版本之間,常數*從不*會發生變化。因此,當程序集B引用程序集A中的一個常量C時,編譯器*會將C中的值嵌入到B中。如果您然後在A中更改常量,那麼B仍然具有原始值,並且會一直重新編譯B.如果希望該值是在運行時拾取的值,而不是使用屬性或只讀字段。 – 2010-06-28 20:50:20

相關問題