Visual Studio 调试技巧之即时窗口的妙用
在 Visual Studio 中有一个窗口叫 Immediate 窗口,中文版本应该叫即时窗口。默认会在你启动调试时在 VS 编辑器中弹出来。你也可以通过 Debug | Windows | Immediate 或者使用快捷键 Ctrl+Alt+I 手动把它调出来。

这个窗口很实用,尤其是在调试的时候。下面总结几个即时窗口的实用技巧。
1. 临时运行C#代码
有时候你可能只想知道一句C#代码运行的结果,比如你突然想知道一个空数组调用Sum()方法会不会报错,或者想查看一下Math.PI的值。你不用傻傻地把测试代码写在项目里,设个断点,然后把项目跑起来查看。你可以在即时窗口中直接写C#代码,然后按回车即可。比如输入:
Console.WriteLine("Welcome!")
回车运行:

再如,你可以直接输入 Math.PI 等表达式和调用某些方法:

也可以用 VS 的另外一个窗口 View | Other Windows | C# Interactive 来实现个功能。如果只是为了临时运行 C# 代码块,则C# Interactive 会更好用些。两者使用有些区别,C# Interactive 打印内容需要手动调用 Console.Write 等方法:

2. 调试时调用任何方法
假如你正在调试一个方法,你临时测试一下这个方法对于不同的参数的执行过程或运行结果。比如对于这样一段代码:
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 调试再重新启动。

另外,在即时窗口可以调用私有方法,也就是说它不受方法的访问权限限制。

不过,在即时窗口编写调用私有方法的代码时是没有智能提示的。
3. 使方法执行不影响上下文
默认情况下,在即时窗口运行的代码,执行完后会对上下文产生副作用(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 后,执行的那句代码相当于在一个沙箱中运行,和上下文互不干扰。
4. 访问特殊变量
Visual Studio 在调试过程中有一些特殊的变量,可以在即时窗口打印它们的值。这些特殊的变量以 $ 作为前缀,通过智能提示可以看到目前有三个这样的特殊变量:
$exception,当前的异常信息。有时候在调试时,你代码的try/catch语句没有给 catch 语句使用 Exception 参数,则可以在即使窗口使用该特殊变量打印异常信息。
$returnvalue,当前语句的返回值。有时候你在代码中调用了一个方法,但你并没有用一个变量来存储这个方法的返回值,而你在调试时又想知道它的返回值。此时你可以在方法执行处添加一个断点。当运行到该断点时,按 F10,然后在即时窗口可以通过$returnvalue打印该方法的返回值。
$user,可以用来获取当前登录操作系统的用户信息和当前运行的进程和线程信息。这个我也没用过,官方文档介绍也比较简单,也不知道这个特殊变量包含哪些成员。直接打印是这样的:
结束
本文分享的这几个即时窗口的技巧,在调试时很实用,在工作中我经常使用,希望它也可以帮助你提高开发效率。关于调试,VS 还有其它好用的工具或技巧,比如有一个 Watch(监视)窗口,如果调试时要频繁查看一个对象的值,使用监视窗口比即时窗口方便很多。
当然,还是希望大家自己去探索更多的技巧,以做到能更高效灵活地使用 VS 这个强大的编辑器。
Visual Studio 调试技巧之即时窗口的妙用的更多相关文章
- Visual Studio 调试技巧[Command Window & Immediate Window ](Tips)
Visual Studio 调试技巧[Command Window & Immediate Window ](Tips) 1. immediate window 定义的一些 alias (// ...
- Visual Studio调试技巧 -- Attach to Process
本文系作者原创,但可随意转载.另:图中使用的IDE为Visual Studio 2013 RC 英文版. 一般写完代码时,我们通常会启动调试运行一下看看是否正确,启动运行的方式无非是F5-- Star ...
- 新手必备!11个强大的 Visual Studio 调试技巧
简介 调试是软件开发周期中很重要的一部分.它具有挑战性,同时也很让人疑惑和烦恼.总的来说,对于稍大一点的程序,调试是不可避免的.最近几年,调试工具的发展让很多调试任务变的越来越简单和省时. 这篇文章总 ...
- Visual Studio 调试技巧
.net程序开发工具我都用vs(visual studio),开发过程中的跟踪调试最常用的就是断点跟踪调试了,但是现在才发现,用了这么多年vs断点跟踪调试是白用了啊.它居然还可以有这么多用法. 设置断 ...
- Visual Studio 调试技巧 -- 为 Lambda 表达式设置中断
如果我说 .NET 世界上最厉害的开发平台(语言),资深的同仁肯定不会往下看了,因为这将是一个无休止的争论,到头来搞不好还是人身攻击.然而,如果我说 Visual Studio 是世界上最友好最强大的 ...
- Visual Studio 调试技巧:10 篇热文汇总
本文精选了 DotNet 2017年11月份的10篇热门文章.其中有技术分享.技术资源. 注:以下文章,点击标题即可阅读 <Visual Studio的调试技巧 > 调试技巧是衡量程序员 ...
- Visual Studio 调试技巧---指针,元素个数
刚才,我在Visual Studio 中发现了一个以更好的方式调试指针的技巧.您可以在监视窗口中选择“n”,其中“n”是要显示的元素数.我认为下图是不言而喻的.
- BI之SSIS入门最新版Visual Studio调试技巧
简介 最近公司业务需要用到BI SSIS,SSIS是什么?"SSIS是Microsoft SQL Server Integration Services的简称,是生成高性能数据集成解决方案( ...
- Visual Studio调试技巧 -- Attach to Process #Reprinted#
from:http://www.cnblogs.com/lyosaki88/p/3481338.html 一般写完代码时,我们通常会启动调试运行一下看看是否正确,启动运行的方式无非是F5-- Star ...
随机推荐
- 常用数据结构-集合(set)
集合(set)是python中最容易被忽视的.使用集合的主要好处在于速度快. 集合的一些特性: 集合元素不能重复 不支持索引访问集合中的元素 集合使用散列之后,可以在O(1)时间内访问元素 支持一些常 ...
- QQ 邮箱日历提醒
偶然发现 QQ 邮箱有日历的功能,而且可以设置农历并且每年邮件 + 短信 + 微信提醒.这下重要的日子(eg:生日...)就不会忘记啦! 1.找到日历 2.历史提醒 3.新建时间 4.设置时间 5.勾 ...
- 【Jmeter】第一个接口测试案例
测试步骤如下: 1.测试计划 2.线程组 3.HTTP Cookie管理器 4.Http信息头管理 5.Http请求默认值 6.Sampler(HTTP请求) 7.断言 8.监听器(查看结果树.图形结 ...
- 动态规划之KMP字符匹配算法
KMP 算法(Knuth-Morris-Pratt 算法)是一个著名的字符串匹配算法,效率很高,但是确实有点复杂. 很多读者抱怨 KMP 算法无法理解,这很正常,想到大学教材上关于 KMP 算法的讲解 ...
- DFA简介
DFA(Detrend Fluctuation Analysis)与scale-free scale-free的本质特征是self-affine or self-similar.具体的,体现在几何上, ...
- 不停机不更新代码线上调试BUG的工具
如果你有以下痛点,请你查看本文章: 1.我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? 2.遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? 3.线上遇到某个用户的 ...
- 配置交换机Trunk接口流量本地优先转发(集群/堆叠)
组网图形 Eth-Trunk接口流量本地优先转发简介 在设备集群/堆叠情况下,为了保证流量的可靠传输,流量的出接口设置为Eth-Trunk接口.那么Eth-Trunk接口中必定存在跨框成员口.当集群/ ...
- python3爬虫应用--爬取网易云音乐(两种办法)
一.需求 好久没有碰爬虫了,竟不知道从何入手.偶然看到一篇知乎的评论(https://www.zhihu.com/question/20799742/answer/99491808),一时兴起就也照葫 ...
- simulink产生周期矩形波和8421码
初次入门simulink,由于学习了数字逻辑,试图进行仿真,首先需要的就是8421码,但是没找到simulink里面相关模块,如果各位知道怎么弄可以评论告诉我分享分享哈哈 我用的是matlab2016 ...
- 安装tomcat for ubuntu linux差点没晕死我!
我滴个神!装ubuntu的tomcat差点没有晕死我!怎么回事呢? 应该说是装好了,执行了bin/startup.sh了,出现以下画面: Using CATALINA_BASE: /home/niew ...