重构代码Visual Studio 2010非常有用的一个功能就是对代码进行重构。
有时我们需要在应用程序的多个位置写相同的(或者非常相似的)代码。在这种情况下,可以选定刚刚输入的代码块,然后从"重构"菜单中选择"提取方法"。随后会出现"提取方法"对话框,提示你输入一个新方法的名称,这个新方法将用于包含你刚才输入的代码。请输入方法名,并单击"确定"。随后,系统将创建这个方法,并将你刚才输入的代码转移到其中,刚才输入的代码则被替换成对该方法的一个调用。提取方法"还具有一定的智能,可以判断方法是否应该获取任何参数,以及是否应该返回一个值。
测试程序1. 在“调试”菜单中选择“开始执行(不调试)”。 随后,Visual Studio 2010将生成程序,并运行它。随后将显示一个控制台窗口。
2. 在Enter your daily rate(输入每天收费金额)提示之后,请输入525并按Enter键。
3. 在Enter the number of days(输入天数)提示之后,请输入17并按Enter键。 程序会在控制台窗口显示以下消息:
The consultant’s fee is: 9817.5
4. 按Enter键关闭应用程序并返回Visual Studio 2010编程环境。
在下一个练习中,我们将使用Visual Studio 2010调试器,以“慢动作”运行程序。你将看到每个方法被调用的时刻(这称为跳入方法,即step into,UI中翻译成“逐语句”),并看到方法的return语句如何将控制(权)返还给调用者(这称为跳出方法,即step out)。我们可以使用“调试”工具栏中的工具在方法中跳入和跳出。然而,在“调试”模式中运行应用程序时,相同的命令也可以从“调试”菜单中选择。
使用Visual Studio 2010调试器来单步执行1. 在“代码和文本编辑器”窗口中,找到run方法。
2. 移动鼠标指针,使其对准run方法的第一个语句:
double dailyRate = readDouble("Enter your daily rate: ");
3. 右击该行,从弹出菜单中选择“运行到光标处”。程序将开始运行,并在抵达上述语句暂停。“代码和文本编辑器”窗口左侧的一个黄色箭头指明了当前语句,该语句还会用一个黄色背景来突出显示。
4. 在“视图”菜单中选择“工具栏”,确定已勾选了“调试”工具栏。 注意,“调试”工具栏也许停靠在其他工具栏旁边。如果仍然看不见它,试着使用“视图”菜单中的“工具栏”命令暂时隐藏它,并留意哪些按钮从界面上消失了。然后再次显示这个工具栏。“调试”工具栏如下图所示(Microsoft Visual C# 2010学习版的工具栏稍有不同,它没有最右侧的“断点”按钮)。
由于历史的原因,人们看到VS中文版“调试”工具栏中的按钮译名时,一直都很难理解它们真正的含义。逐语句、逐过程和跳出分别对应的是Step Into,Step Over和Step Out。其中,Step Into和Step Over最难区分。为什么在译文里面有一个“过程”呢?原来,这个词是VB盛行时候的产物。所谓“逐过程”(Step Over),是指在调试的时候,如果遇到一个“过程”(在C#中称为“方法”)调用,就直接调用它(Over它),不对该子程序(方法)中的语句进行单步调试。相反,在遇到一个过程(方法)调用时,如果单击的是“Step Into”按钮,就会进入(Into)这个子程序(方法),并对其中的语句进行调试。至于Step Out则很好理解,就是直接执行当前子程序(方法)剩余的语句,然后跳出这个代码块,返回调用位置。要了解这三个术语的更详细的区别,请访问http://www.developerfusion.com/article/33/debugging/4/。
提示:要将"调试"工具栏独立出来,请利用工具栏左侧的控点,把它从原处拖出来。双击独立工具栏的标题,即可使之重新归位。
5. 单击“调试”工具栏中的“逐语句”按钮(即左数第6个按钮)。 这个操作会导致调试器跳入正在调用的方法。左侧的黄色箭头会指向readDouble方法的起始大括号。
6. 再次单击“逐语句”按钮,指针会转向第一个语句:
Console.Write(p);
提示:按F11键的作用等同于单击"调试"工具栏中的"逐语句"按钮。
7. 在“调试”工具栏中单击“逐过程”按钮(左数第7个按钮)。 这个操作会导致方法执行下一个语句而不调试它。黄色箭头将指向方法的第二个语句,在返回Visual Studio 2010之前,程序在一个控制台窗口中显示“Enter Your Daily Rate”提示(控制台窗口可能隐藏在Visual Studio 2010后面)。
提示:按F10键的作用等同于单击"调试"工具栏中的"逐过程"按钮。
8. 在“调试”工具栏中单击“逐过程”按钮。 这一次,黄色箭头会消失,控制台窗口将获得焦点,因为程序正在执行Console.ReadLine方法,并正在等待用户输入内容。
9. 在控制台窗口中键入525,按Enter键继续。 随后,控制权返回Visual Studio 2010。黄色箭头将在方法的第3行出现。
10. 不要点鼠标按钮,将鼠标指针移至方法第2行或第3行对line变量的引用上(具体对准哪一行无关紧要)。 随后会出现一条屏幕提示,它显示line变量的当前值是"525"。利用这个功能,可以判断当执行到一个特定的语句时,变量是否已被设置成自己期望的一个值。
11. 在“调试”工具栏中单击“跳出”按钮(左数第8个按钮)。 这个操作会导致方法在不被打断的前提下,一直执行到它的末尾。readDouble方法执行完毕之后,黄色箭头会指回run方法的第1个语句。
提示 按Shift + F11组合键的作用等同于单击"调试"工具栏中的"跳出"按钮。
12. 在“调试”工具栏中单击“逐语句”按钮。 随后可见黄色箭头移至run方法的第2个语句:
int noOfDays = readInt("Enter the number of days: ");
13. 在“调试”工具栏中单击“逐过程”按钮。
这一次,我们选择了直接运行方法,而不逐语句地调试该方法。控制台窗口将再次出现,提示键入天数。
14. 在控制台窗口中输入17,按Enter键继续。控制权将返回Visual Studio 2010。黄色箭头移至run方法的第3个语句:
writeFee(calculateFee(dailyRate, noOfDays));
15. 在“调试”工具栏中单击“逐语句”按钮。 随后可见黄色箭头将跳至calculateFee方法的起始大括号处。该方法将先于writeFee方法被调用。因为该方法返回的值被用作writeFee方法的参数。
16. 在“调试”工具栏中单击“跳出”按钮。 黄色箭头将跳回run方法的第3个语句。
17. 在“调试”工具栏中单击“逐语句”按钮。 这一次,黄色箭头将跳至writeFee方法的起始大括号处。
18. 将鼠标指针对准方法定义中的p变量。 随后ScreenTip中将显示p的值(8925.0)。
19. 在“调试”工具栏中单击“跳出”按钮。 随后,控制台窗口中会显示消息“The consultant's fee is: 9817.5”(如果控制台窗口隐藏在Visual Studio 2010的后面,请把它带到前台来观察)。黄色箭头将返回run方法的第3个语句。
20. 在“调试”工具栏中单击“继续”按钮(即工具栏的第1个按钮),使程序连续运行,不在每个语句处暂停。
提示:还可以按F5键在调试器中继续执行。
应用程序将一直运行至结束。Y餝剉i