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