今天在調試同事的一段代碼時,發現有一段代碼調試時怎麼也進不去,難道遇到了Visual Studio的調試禁區?
簡化後的代碼如下: class Program
{
static void Main(string[] args)
{
SimpleClass simpleClass = new SimpleClass();
string myString = simpleClass.OneField;
}
}
public class SimpleClass
{
private string _oneField = string.Empty;
public string OneField
{
get
{
if (_oneField.Length == 0)
{
_oneField = GetMyString();
}
return _oneField;
}
}
private string GetMyString()
{
return "just for test~";
}
}
無法調試的代碼即“_oneField = GetMyString();”這一行。
大家可以自行調試,會發現是因為_oneField這個變數總是被莫名其妙的賦上值了,但明明我們還沒有給它賦值……
和同事討論過後,還是沒有得出明確的結論,只是推測可能是因為Visual Studio在調試的過程中,自動掃描對象中的屬性,然後自行運行屬性的get操作~
不知道大家有沒有遇到這種情況,雖然最終通過把OneField屬性改寫成函數解決了這個問題,但還是有些不爽,難道在Visual Studio就真的沒有辦法調試如上代碼?
更新結論:
經過大家的反饋,我重複試了多次,總結如下,歡迎大家反饋意見——
要重現我以上的問題,可按如下步驟操作:在“SimpleClass simpleClass = new SimpleClass();”這一行加上斷點,然後逐行調試,並且(請注意,這一點很重要,相信很多兄弟和我的調試結果不一樣,可能就是因為這個原因),滿足以下任一條件:
1、在調試過程中開啟了Autos視窗
2、將simpleClass.OneField添加到了Watch中
3、運行到“simpleClass.SecondField = "me";”這一行時,滑鼠移到對象“simpleClass”上,在彈出的資訊顯示層中點擊“+”,查看一下“simpleClass”對象的各屬性值,嗯,這個操作的作用和開啟Autos視窗一樣)
那麼,最終是無法到達“_oneField = GetMyString();”這一行的;
進一步更新:
本以為以上發現的問題不會影響程式啟動並執行結果,但卻意外發現有時也會影響到程式最終啟動並執行結果——
代碼如下: class Program
{
static void Main(string[] args)
{
SimpleClass simpleClass = new SimpleClass();
simpleClass.SecondField = "me";
string myString = simpleClass.OneField;
Console.WriteLine(myString);
Console.Read();
}
}
public class SimpleClass
{
private string _oneField = string.Empty;
private string _secondField = string.Empty;
public string OneField
{
get
{
if (_oneField.Length == 0)
{
_oneField = GetMyString();
}
return _oneField;
}
}
public string SecondField
{
get { return _secondField; }
set { _secondField = value; }
}
private string GetMyString()
{
return "SecondField:" + SecondField;
}
}
以上這段代碼正確的輸出應該是:“SecondField:me”。
但如果我們在調試中這樣做了的話。。。
嗯,還是從“SimpleClass simpleClass = new SimpleClass();”這一行開始逐行調試,運行到“simpleClass.SecondField = "me";”這一行時(注意,一定要在運行“simpleClass.SecondField = "me";”這一語句之前進行以下操作),滑鼠移到對象“simpleClass”上,在彈出的資訊顯示層中點擊“+”,查看一下“simpleClass”對象的各屬性值,然後,OK,F5吧,你會發現,最後的輸出變成了:“SecondField:”!!!
到目前為止最好的解決辦法:
Options -> Debugging -> General -> Enabled property evaluation and other implicit function calls
去掉這個選項的選中狀態!
然後,以上所有的問題都得以解決——這個世界,終於清靜了。。。。。。
感謝Q.yuhen兄弟!