在 Visual Studio 中有一個窗口叫 Immediate 窗口,中文版本應該叫即時窗口。默認會在你啟動調試時在 VS 編輯器中彈出來。你也可以通過 Debug | Windows | Immediate 或者使用快捷鍵 Ctrl+Alt+I 手動把它調出來。
這個窗口很實用,尤其是在調試的時候。下面總結幾個即時窗口的實用技巧。
有時候你可能只想知道一句C#代碼運行的結果,比如你突然想知道一個空數組調用Sum()方法會不會報錯,或者想查看一下Math.PI的值。你不用傻傻地把測試代碼寫在項目裡,設個斷點,然後把項目跑起來查看。你可以在即時窗口中直接寫C#代碼,然後按回車即可。比如輸入:
Console.WriteLine("Welcome!")
回車運行:
再如,你可以直接輸入 Math.PI 等表達式和調用某些方法:
也可以用 VS 的另外一個窗口 View | Other Windows | C# Interactive 來實現個功能。如果只是為了臨時運行 C# 代碼塊,則C# Interactive 會更好用些。兩者使用有些區別,C# Interactive 列印內容需要手動調用 Console.Write 等方法:
假如你正在調試一個方法,你臨時測試一下這個方法對於不同的參數的執行過程或運行結果。比如對於這樣一段代碼:
class Program{ static void Main(string[] args) { var foo = new Foo(); var result = foo.Add(1, 2, 3); Console.WriteLine(result); }}public class Foo{ public int Add(params int[] nums) { if (nums?.Length < 1) return 0; var result = 0; foreach (var n in nums) { // ...(其它代碼) result += n; } return result; }}
若想用不同的參數來測試foo.Add方法的運行情況,普通的做法是啟動多次調試,每次調試都修改一下調用代碼 foo.Add 的參數。使用即時窗口,你可以在方法調用處打個斷點。然後在即時窗口編寫調用代碼,它會直接使用當前上下文進行調試。不需要中斷 VS 調試再重新啟動。
另外,在即時窗口可以調用私有方法,也就是說它不受方法的訪問權限限制。
不過,在即時窗口編寫調用私有方法的代碼時是沒有智能提示的。
默認情況下,在即時窗口運行的代碼,執行完後會對上下文產生副作用(Side Effect)。比如對於這樣一段代碼:
class Program{ static void Main(string[] args) { var foo = new Foo(); Console.WriteLine(); }}public class Foo{ public int Num { get; private set; } public int Increase() { return ++Num; }}
在即時窗口中調用foo.Increase後,Num 的變化如下:
但很多時候我們只希望即使窗口只是臨時運行一下調試代碼,不想讓它真修改上下文的狀態。我們只需在表達式後面添加 , nse(no side effect 的簡寫)即可:
加上 nse 後,執行的那句代碼相當於在一個沙箱中運行,和上下文互不幹擾。
Visual Studio 在調試過程中有一些特殊的變量,可以在即時窗口列印它們的值。這些特殊的變量以 $ 作為前綴,通過智能提示可以看到目前有三個這樣的特殊變量:
本文分享的這幾個即時窗口的技巧,在調試時很實用,在工作中我經常使用,希望它也可以幫助你提高開發效率。關於調試,VS 還有其它好用的工具或技巧,比如有一個 Watch(監視)窗口,如果調試時要頻繁查看一個對象的值,使用監視窗口比即時窗口方便很多。
當然,還是希望大家自己去探索更多的技巧,以做到能更高效靈活地使用 VS 這個強大的編輯器。
-
精緻碼農
帶你洞悉編程與架構
點頭像關注,不錯過網海相遇的緣分[比心]