C#在除錯時避免觸發屬性
阿新 • • 發佈:2018-12-09
在除錯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,取消這個設定: