映射代码图上特定的依赖关系
如果你希望了解代码的具体依赖关系,可通过创建代码图进行可视化(仅限 Visual Studio Ultimate)。 然后你可以利用映射(就在代码旁边)导航这些关系。 这样可以在你工作时跟踪你在代码中的位置。
绿色的箭头表示你的光标在编辑器中的位置。 你可以在代码图上进行注释,就像在纸上记录一样。
代码图有助于防止你在大型基本代码、不熟悉的代码或旧代码中迷失方向。 例如,在调试时,可能需要在很多不同的文件和项目之间查看代码。 代码图可帮助你在这些代码段中导航,了解代码段之间的关系。 你不必记住所有这些代码、跟踪文件或单独绘制纸质关系图。 如果你必须中断工作,代码图有助于让你回想起你正在处理的代码。
创建或打开代码图
若要创建代码图,需要 Visual Studio Ultimate 2013 以及具有 Visual C# .NET、Visual Basic .NET、适用于 Microsoft Dynamics AX 的 X++ 或 C++ 代码(有限支持)的解决方案。 若要了解颜色代码的关系,你需要使用 Visual Studio 2013 Update 3。 若要映射 X++ 代码和多个应用所共享的代码,你需要使用 Visual Studio 2013 Update 2 或更高版本。
可以通过以下方式创建代码图:
在解决方案资源管理器中右键单击某个项(如源文件或二进制文件),然后选择**“在代码图上显示”**。 这会为所选项创建代码图。
将某个项(如源文件或二进制文件)从解决方案资源管理器拖动到打开的代码图上,以在图中包含和/或突出显示该项。
右键单击编辑器窗口的空白区域,然后选择**“在代码图上显示”**。 这会创建新的空代码图。
在编辑器窗口中右键单击某个对象或类,然后选择**“在代码图上显示”**。 这会为所选项创建代码图。 还可以使用此菜单在代码图中查找所有引用或或显示相关项。
应用程序暂停时,在**“调试”菜单上单击“代码图”**按钮。
从打开的 IntelliTrace 文件中,或从**“体系结构”**菜单中作为依赖项关系图。
可以使用 Visual Studio Premium 2013 或 Visual Studio Professional 2013 进行查看、有限的编辑和导航。
在你与使用 Premium 或 Professional 版本的其他人共享代码图之前,请确保代码图上的所有项是可见的,例如隐藏项、展开的组和跨组链接。
观看代码图的实际应用:使用代码图理解复杂代码(第 9 频道)
了解问题
假定你正在处理的绘图程序中有 Bug。 若要重现 Bug,请在 Visual Studio Ultimate 中打开解决方案并按 F5 开始调试。
当你绘制了一条线并选择**“撤消上次笔划操作”**后,在你绘制下一条线前什么也没有发生。
因此你开始通过搜索 Undo 方法来进行调查。 你将会在 PaintCanvas 类中找到它。
开始映射代码
现在你开始映射 undo 方法及其关系。 从代码编辑器中,将 undo 方法及其引用的字段添加到新的代码图。 创建新的代码图时,可能需要一些时间来为代码编制索引。 这有助于加快后续操作的运行速度。
提示
突出显示的绿色部分显示了上次添加到代码图中的项。绿色箭头显示你的光标在代码中的位置。各项之间的箭头表示不同的关系。你可以通过检查相应的工具提示来详细了解有关代码图上各项的信息。
浏览并检查映射中的代码
若要查看每个字段的代码定义,请在代码图上双击该字段,或选择该字段并按 F12。 绿色箭头在代码图上的各项之间移动。 代码编辑器中的光标也会自动移动。
提示
你还可以通过在代码编辑器中移动光标来移动代码图上的绿色箭头。
了解代码部分之间的关系
现在你需要知道与 history 和 paintObjects 字段交互的其他代码。 你可以将引用这些字段的所有方法添加到代码图。 你可以通过代码图或代码执行此操作。
更改布局以重新排列关系流并使代码图更容易阅读。 你还可以通过在代码图上拖动各个项来移动它们。
提示
默认情况下,“增量布局”处于打开状态。当你添加新的项时,这会尽可能少地重新排列代码图。若要在你每次添加新项时重新排列整个代码图,请关闭“增量布局”。
让我们检查这些方法。 在代码图上,双击 PaintCanvas 方法,或选择此方法并按 F12。 你将了解到,此方法将以空列表的形式创建 history 和 paintObjects。
现在请重复相同的步骤以检查 clear 方法定义。 你将了解到,clear 会通过 paintObjects 和 history 执行某些任务, 然后它将调用 Repaint 方法。
现在请检查 addPaintObject 方法定义。 它也使用 history 和 paintObjects 执行某些任务, 它还调用 Repaint。
通过检查映射找到问题
似乎修改 history 和 paintObjects 的所有方法都会调用 Repaint。 但是,undo 方法不会调用 Repaint,即使 undo 修改相同的字段。 因此,你认为可以通过从 Repaint 调用 undo 来解决此问题。
如果你没有可显示此缺失调用的代码图,要找到此问题或许更加困难,尤其是在具有更复杂的代码时。
共享发现和后续步骤
在你或其他人修复此 Bug 之前,你可在代码图上针对此问题和解决方法进行注释。
例如,你可以在代码图上添加注释并使用颜色标记项。
如果已安装 Microsoft Outlook,则可以将代码图以电子邮件的形式发送给其他人。 还可以将代码图导出为图像或其他格式。
解决该问题并显示你所做的工作
若要修复此 Bug,你需要将 Repaint 的调用添加到 undo。
若要确认你的修复,请重新启动你的调试会话并尝试重现 Bug。 现在,按照预期的方式选择**“撤消上次笔划操作”**,并确认做出了正确修复。
你可以更新代码图以显示所做的修复。
你的代码图现在会在**“撤消”和“重新绘制”**之间显示一个链接。
备注
更新代码图时,你可能会看到说明用于创建代码图的代码索引已更新的消息。这意味着有人更改了代码,造成你的代码图与当前代码不匹配。这不会阻止你更新代码图,但你可能必须重新创建代码图以确认它与代码匹配。
现在你已完成调查。 你通过映射代码成功找到并解决了问题。 你也拥有可帮助你浏览代码的代码图,请记住你所学的内容并演示你用于解决此问题的步骤。