在 Visual Studio 中有一個窗口叫 Immediate 窗口,中文版本應(yīng)該叫即時窗口。默認會在你啟動調(diào)試時在 VS 編輯器中彈出來。你也可以通過 Debug | windows | Immediate 或者使用快捷鍵 Ctrl+Alt+I 手動把它調(diào)出來。
這個窗口很實用,尤其是在調(diào)試的時候。下面總結(jié)幾個即時窗口的實用技巧。
臨時運行C#代碼
有時候你可能只想知道一句C#代碼運行的結(jié)果,比如你突然想知道一個空數(shù)組調(diào)用Sum()方法會不會報錯,或者想查看一下Math.PI的值。你不用傻傻地把測試代碼寫在項目里,設(shè)個斷點,然后把項目跑起來查看。你可以在即時窗口中直接寫C#代碼,然后按回車即可。比如輸入:
Console.WriteLine("Welcome!")
回車運行:
再如,你可以直接輸入 Math.PI 等表達式和調(diào)用某些方法:
也可以用 VS 的另外一個窗口 View | Other Windows | C# Interactive 來實現(xiàn)個功能。如果只是為了臨時運行 C# 代碼塊,則C# Interactive 會更好用些。兩者使用有些區(qū)別,C# Interactive 打印內(nèi)容需要手動調(diào)用 Console.Write 等方法:
調(diào)試時調(diào)用任何方法
假如你正在調(diào)試一個方法,你臨時測試一下這個方法對于不同的參數(shù)的執(zhí)行過程或運行結(jié)果。比如對于這樣一段代碼:
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;
}
}
若想用不同的參數(shù)來測試foo.Add方法的運行情況,普通的做法是啟動多次調(diào)試,每次調(diào)試都修改一下調(diào)用代碼 foo.Add 的參數(shù)。使用即時窗口,你可以在方法調(diào)用處打個斷點。然后在即時窗口編寫調(diào)用代碼,它會直接使用當前上下文進行調(diào)試。不需要中斷 VS 調(diào)試再重新啟動。
另外,在即時窗口可以調(diào)用私有方法,也就是說它不受方法的訪問權(quán)限限制。
不過,在即時窗口編寫調(diào)用私有方法的代碼時是沒有智能提示的。
使方法執(zhí)行不影響上下文
默認情況下,在即時窗口運行的代碼,執(zhí)行完后會對上下文產(chǎn)生副作用(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;
}
}
在即時窗口中調(diào)用foo.Increase后,Num 的變化如下:
但很多時候我們只希望即使窗口只是臨時運行一下調(diào)試代碼,不想讓它真修改上下文的狀態(tài)。我們只需在表達式后面添加 , nse(no side effect 的簡寫)即可:
加上 nse 后,執(zhí)行的那句代碼相當于在一個沙箱中運行,和上下文互不干擾。
訪問特殊變量
Visual Studio 在調(diào)試過程中有一些特殊的變量,可以在即時窗口打印它們的值。這些特殊的變量以 $ 作為前綴,通過智能提示可以看到目前有三個這樣的特殊變量:
- $exception,當前的異常信息。有時候在調(diào)試時,你代碼的 try/catch 語句沒有給 catch 語句使用 Exception 參數(shù),則可以在即使窗口使用該特殊變量打印異常信息。
- $returnvalue,當前語句的返回值。有時候你在代碼中調(diào)用了一個方法,但你并沒有用一個變量來存儲這個方法的返回值,而你在調(diào)試時又想知道它的返回值。此時你可以在方法執(zhí)行處添加一個斷點。當運行到該斷點時,按 F10,然后在即時窗口可以通過 $returnvalue 打印該方法的返回值。
- $user,可以用來獲取當前登錄操作系統(tǒng)的用戶信息和當前運行的進程和線程信息。這個我也沒用過,官方文檔介紹也比較簡單,也不知道這個特殊變量包含哪些成員。直接打印是這樣的:
結(jié)束
本文分享的這幾個即時窗口的技巧,在調(diào)試時很實用,在工作中我經(jīng)常使用,希望它也可以幫助你提高開發(fā)效率。關(guān)于調(diào)試,VS 還有其它好用的工具或技巧,比如有一個 Watch(監(jiān)視)窗口,如果調(diào)試時要頻繁查看一個對象的值,使用監(jiān)視窗口比即時窗口方便很多。
當然,還是希望大家自己去探索更多的技巧,以做到能更高效靈活地使用 VS 這個強大的編輯器。