Visual Studio也有調試禁區?!

來源:互聯網
上載者:User
今天在調試同事的一段代碼時,發現有一段代碼調試時怎麼也進不去,難道遇到了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兄弟!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.