1. 程式人生 > >C#在除錯時避免觸發屬性

C#在除錯時避免觸發屬性

在除錯C#程式碼時,如果定義了某個屬性獲取物件,如下:

namespace ConsoleApplication3
{
    class Program
    {
        private static volatile Program _Instance;
        private static object _thisLock = new object();
        public static Program Get
        {
            get
            {
                lock (_thisLock)
                {
                    if (_Instance == null)
                    {
                        Console.WriteLine("New Program");
                        _Instance = new Program();
                    }
                    return _Instance;
                }
            }
        }
        public void PrintMsg(string msg)
        {
            Console.WriteLine(msg);
        }
        static void Main(string[] args)
        {
            Program.Get.PrintMsg("Hello");
            Console.ReadLine();
        }
    }
}

當設定斷點在Program.Get.PrintMsg("Hello");這行時,在變數檢視視窗會發現Program.Get具有值,如果此時進入屬性Get中設定斷點,卻發現_Instance不等於null;如果不在Program.Get.PrintMsg("Hello");設定斷點,直接在Get中設定斷點,會發現_Instance確實為null。同樣的程式碼出現兩種不同的情況,_Instance等於null和不等於null的情況。根據網上的解釋,是因為將斷點設定到Program.Get.PrintMsg("Hello");這行時,在檢視變數的過程中,VS會自動在內部執行屬性程式碼,因此當再次進入Get獲取物件時,就會發現物件已經不等於null,因此Program就沒有被指定的程式碼new或執行。

如何解除這樣的設定?

進入選單 Tools > Options > Debugging > General,取消這個設定: