C#编写方法实例

  开发应用程序逻辑

  1. 在Visual Studio 2005中打开My Documents文件夹下的\Microsoft Press\Visual CSharp Step by Step\Chapter 3\DailyRate子文件夹中的DailyRate项目。

  2. 在“解决方案资源管理器”中,双击Program.cs文件,以便在“代码和文本编辑器”窗口中显示程序。

  3. 在run方法主体中添加以下语句:

double dailyRate = readDouble("Enter your daily rate: ");
int noOfDays = readInt("Enter the number of days: ");
writeFee(calculateFee(dailyRate, noOfDays));

  应用程序启动时,run方法将由Main方法调用。

  刚才在run方法中添加的代码块会调用readDouble方法(马上就要开始写这个方法),以便让用户输入顾问的日费率。下一个语句调用readInt方法(也马上由我们来写)来获取天数。最后将调用writeFee方法(等待编写),以便在屏幕上显示结果。注意,传给writeFee的值是calculateFee方法(最后一个要写的方法)返回的值,该方法获取日费率和天数,并计算出要支付的总金额。

  注意 由于尚未写好readDouble,readInt,writeFee或者calculateFee方法,所以“智能感知”无法在输入上述代码的时候自动列出它们。另外,先不要试图生成程序,因为肯定会失败。

  使用“生成方法存根向导”来编写方法

  1. 在“代码和文本编辑器”窗口中,单击run方法中的readDouble方法调用。

  随后会在readDouble的第一个字母("r")下方显示一个小的下划线图标。将鼠标指针移至字母"r",会自动出现一个图标。将鼠标指针悬停在这个图标上方,会显示一条工具提示:“用于生成方法存根的选项(Shift + Alt + F10)”,并提供了一个下拉菜单。单击下拉菜单,就会看到一个选项:生成"DailyRate.Program"中的"ReadDouble"的方法存根。

  2. 单击“生成"DailyRate.Program"中的"ReadDouble"的方法存根”选项。

  随后,“生成方法存根向导”会检查对readDouble方法的调用,判断参数类型和返回值,并生成一个具有默认实现的方法,如下所示:

private double readDouble(string p)
{
    throw new Exception("The method or operation is not implemented.");
}

  新方法是使用一个private限定符来创建的。方法主体目前只是掷出一个异常。我们将在下一步将主体替换成自己的语句。

  3. 从readDouble方法中删除throw new Exception(…);语句,将它替换成以下代码行:

Console.Write(p);
string line = Console.ReadLine();
return double.Parse(line);

  上述代码块会将变量p中的字符串输出到屏幕。该变量是调用方法是传递的字符串参数,其中包含提示用户输入日费率的一条消息。用户输入一个值,该值将通过ReadLine方法读入一个字符串中,并通过double.Parse方法转换成一个double值。结果将作为方法调用的返回值传回。

  注意 ReadLine方法是与WriteLine配套的一个方法,它从键盘读取用户直到按回车键之前的输入。用户输入的文本将作为返回值传回。

  4. 在run方法中,单击readInt方法调用,按照和前面一样的过程,为readInt方法生成一个方法存根。

  readInt方法将使用一个默认的实现来生成。

  提示 为了生成一个方法存根,还可以右击一个方法调用,并从弹出菜单中选择“生成方法存根”。

  5. 将readInt方法的主体替换成以下语句:

Console.Write(p);
string line = Console.ReadLine();
return int.Parse(line);

  这个代码块和readDouble方法的非常相似。惟一的区别是方法返回一个int值,所以要使用int.Parse方法将字符串转换成整数。

  6. 右击run方法中的calculateFee方法调用,选择“生成方法存根”。

  随后会生成calculateFee方法:

private object calculateFee(double dailyRate, int noOfDays)
{
    throw new Exception("The method or operation is not implemented");
}

  注意,“生成方法存根向导”使用传入的实参名称来生成形参名称(当然,假如觉得不合适,完全可以更改形参名称)。更让人感兴趣的是方法的返回类型,目前是object。这表明“生成方法存根向导”无法根据当前的上下文来确定方法应该返回什么类型的值。object类型只是意味着一样“东西”,在方法中添加具体的代码时,应该把它修改成自己需要的类型。

  7. 修改calculateFee方法的定义,使它返回一个double值:

private double calculateFee (double dailyRate, int noOfDays)
{
    throw new Exception("The method or operation is not implemented");
}

  8. 将calculateFee方法的主体替换成以下语句,它计算两个参数值的乘积来获得需要支付的金额,并返回结果。

return dailyRate * noOfDays;

  9. 右击run方法中的writeFee方法调用,选择“生成方法存根”。

  随后会生成writeFee方法。注意,“生成方法存根向导”根据calculateFee方法的定义判断出writeFee方法的参数应该是一个double参数。另外,方法调用没有使用一个返回值,所以方法的类型为void:

private void writeFee(double p)
{
    ...
}

  10. 在writeFee方法内部输入以下语句:

Console.WriteLine("The consultant's fee is: {0}", p * 1.1);

  注意 这个版本的WriteLine方法演示了如何利用一个简单的格式字符串。{0}是一个占位符;在求值的时候,它会被字符串之后的表达式(p * 1.1)的值替换掉。

  11. 选择“生成”|“生成解决方案”。
重构代码

  Visual Studio 2005非常有用的一项特性就是对代码进行重构。某些时候,我们需要在应用程序的多个位置写相同的(或者非常相似的)代码。在这种情况下,可以选定刚刚输入的代码块,然后从菜单栏中选择“重构”|“提取方法”。随后会出现“提取方法”对话框,提示你输入一个新方法的名称,该方法将用于包含你刚才输入的代码。请输入方法名,并单击“确定”。随后,系统将创建这个方法,并将你刚才输入的代码转移到其中,刚才输入的代码则被替换成对该方法的一个调用。“提取方法”还具有一定的智能,可以判断方法是否应该获取任何参数和返回值。

  测试程序

  1. 选择“调试”|“开始执行(不调试)”,Visual Studio 2005将生成程序,并运行它。运行时会显示一个控制台窗口。

  2. 在Enter Your Daily Rate(输入日费率)提示之后,请输入525,然后按回车键。

  3. 在Enter The Number Of Days(输入天数)提示之后,请输入17,然后按回车键。

  程序会在控制台上显示以下消息:

The consultant's fee is: 9817.5

  按回车键返回Visual Studio 2005编程环境。

  在最后一个练习中,将使用Visual Studio 2005调试器,以比较慢的步调来运行程序。你将看到每个方法被调用的时刻(这个行动称为跳入),并看到每个return语句如何将控制返还给调用者(这个行动称为跳出)。进入和离开方法时,都需要使用“调试”工具栏上的工具。然而,在调试模式中运行应用程序时,相同的命令也可从“调试”菜单中选择。

  使用Visual Studio 2005调试器依次执行每个方法

  1. 在“代码和文本编辑器”窗口中,找到run方法。

  2. 使鼠标指针对准run方法中的第一个语句。

  run方法的第一个语句是:

double dailyRate = readDouble("Enter your daily rate: ");

  3. 右击该行的任何地方,从弹出菜单中选择“运行到光标处”。

  程序将开始运行,并在抵达run方法的第一个语句之后暂停。“代码和文本编辑器”窗口左侧的一个黄色箭头指明了当前语句,该语句还会用一个黄色背景来突出显示。

  4. 选择“视图”|“工具栏”,确定已经勾选了“调试”工具栏。“调试”工具栏也许会停靠在其他工具栏旁边。如果找不到这个工具栏,可以试着使用“视图”菜单中的“工具栏”命令暂时隐藏它,并留意哪些按钮从界面上消失了。重新显示这个工具栏,就可以知道它应该在什么位置出现。

  提示 要想将“调试”工具栏独立出来,请使用工具栏左侧的控点,把它拖放以“代码和文本编辑器”窗口上方。

  5. 单击“调试”工具栏上的“逐语句”按钮。这个行动会使调试器跳入正在调用的方法。左侧的黄色箭头会指向readDouble方法的起始大括号。再次单击“逐语句”按钮,指针会转向第一个语句:Console.Write(p);

  提示 按F11键的作用等同于单击“调试”工具栏上的“逐语句”按钮。

  6. 单击“调试”工具栏上的“逐过程”按钮。这会导致方法执行下一个语句而不调试它。黄色箭头将指向方法的第二个语句,程序会在一个控制台窗口中显示“Enter Your Daily Rate”提示(控制台窗口可能隐藏在Visual Studio 2005后面)。

  提示 按F10键的作用等同于单击“调试”工具栏上的“逐过程”按钮。

  7. 单击“调试”工具栏上的“逐过程”按钮。这一次,黄色箭头会消失,控制台窗口将获得焦点,因为程序正在执行Console.ReadLine方法,要求用户输入一些内容。

  8. 在控制台窗口中输入525,按回车键继续。

  随后,控制将返回Visual Studio 2005。黄色箭头将在方法的第三行出现。

  9. 不要做出任何单击行动,请将鼠标指针移至方法第二行或第三行对line变量的引用上(具体对准哪一行无关紧要)。

  随后会出现一条屏幕提示,它显示了line变量的当前值(525)。利用这个特性,可以确定在逐方法执行的时候,变量已经设置成自己期望的一个值。

  10. 单击“调试”工具栏上的“跳出”按钮。

  这会导致当前方法继续无中断地运行,直到结束。当readDouble方法执行完毕之后,黄色箭头会指回run方法的第一个语句。

  提示 按Shift + F11键的作用等同于单击“调试”工具栏上的“跳出”按钮。

  11. 单击“调试”工具栏上的“逐语句”按钮。

  黄色箭头会移至run方法的第二个语句:

int noOfDays = readInt("Enter the number of days: ");

  12. 单击“调试”工具栏上的“逐过程”按钮。

  这一次,选择了直接运行方法,而不逐语句地调试该方法。控制台窗口将再次出现,提示输入一个天数。

  13. 在控制台窗口中输入17,按回车键继续。

  控制将返回至Visual Studio 2005。黄色箭头将移至run方法的第三个语句:

writeFee(calculateFee(dailyRate, noOfDays));

  14. 单击“调试”工具栏上的“逐语句”按钮。

  黄色箭头将跳至calculateFee方法的起始大括号处。该方法将先于writeFee方法被调用。

  15. 单击“调试”工具栏上的“跳出”按钮。

  黄色箭头将跳回run方法的第三个语句。

  16. 单击“调试”工具栏上的“逐语句”按钮。

  这一次,黄色箭头将跳至writeFee方法的起始大括号处。

  17. 让鼠标指针对准方法定义中的p变量。

  随后将显示p的值(8925.0)。

  18. 单击“调试”工具栏上的“跳出”按钮。

  随后会在控制台窗口中显示消息“The consultant's fee is: 9817.5”(如果控制台窗口隐藏在Visual Studio 2005之后,请把它带到前台来显示)。黄色箭头将返回run方法的第三个语句。

  19. 单击“调试”工具栏上的“继续”按钮,使程序连续运行,而不在每个语句处暂停。

  应用程序将一直运行至结束。

  提示 还可以按F5键在调试器中继续执行。

  恭喜!你已经成功编写并调用了方法,并利用Visual Studio 2005调试器对它们进行了调试。

时间: 2008-04-03

Yii扩展组件编写方法实例分析

本文实例讲述了Yii扩展组件编写方法.分享给大家供大家参考.具体如下: 因为Yii本身就引入了Prado的component-based 思想做为主要思想.因此,组件在yii中是很重要的. 组件一般放在components目录里,其格式示例基本如下: <?php /** * some description about the <span style="color: rgb(34, 34, 34); font-family: Arial, sans-serif; font-size:

运行Python编写的程序方法实例

保存代码后,我们使用 windows + R 快捷键并输入 cmd 命令打开电脑命令提示窗口 键入" e: "进入到E盘 输入" cd python "打开python所在目录(注意cd 后面紧跟着一个空格) 接下来就可以直接运行我们刚编写的python程序了,使用命令 python demo.py 即可运行,你就可以看到屏幕上打印了我们在代码里写入的内容 " hello,欢迎大家一起学习python! " 运行Python程序的步骤呢其实也挺简

Kotlin 语言中调用 JavaScript 方法实例详解

Kotlin 语言中调用 JavaScript 方法实例详解 Kotlin 已被设计为能够与 Java 平台轻松互操作.它将 Java 类视为 Kotlin 类,并且 Java 也将 Kotlin 类视为 Java 类.但是,JavaScript 是一种动态类型语言,这意味着它不会在编译期检查类型.你可以通过动态类型在 Kotlin 中自由地与 JavaScript 交流,但是如果你想要 Kotlin 类型系统的全部威力 ,你可以为 JavaScript 库创建 Kotlin 头文件. 内联 J

Python实现Linux下守护进程的编写方法

本文实例讲述了Python实现Linux下守护进程的编写方法,分享给大家供大家参考,相信对于大家的Python程序设计会起到一定的帮助作用.具体方法如下: 1. 调用fork()以便父进程可以退出,这样就将控制权归还给运行你程序的命令行或shell程序.需要这一步以便保证新进程不是一个进程组头领进程(process group leader).下一步,'setsid()',会因为你是进程组头领进程而失败.进程调用fork函数时,操作系统会新建一个子进程,它本质上与父进程完全相同.子进程从父进程继

Android Studio应用开发集成百度语音合成使用方法实例讲解

首先,语音合成是指将文本信息转换成声音.意思就是将文本转化为声音,让你的应用开口说话.国内在业内比较有名的第三方语音合成平台有百度语音和科大讯飞. 本文集成的是百度语音合成,其主要特点是: 完全永久免费 业界首创完全永久免费新形式,为开发者提供最流畅最自然的语音合成服务.完全免费,永久使用,彻底摆脱限制. 离线在线融合模式 SDK可以根据当前网络状况,自动判断使用本地引擎还是云端引擎进行语音合成,再也不用担心流量消耗! 多语言多音色可选 中文普通话.中英文混读.男声.女声任你选,更支持语速.音调

spring中FactoryBean中的getObject()方法实例解析

本文研究的主要是spring中FactoryBean中的getObject()方法的相关内容,具体如下. FactoryBean接口定义了以下3个接口方法: Object getObject():返回有FactoryBean创建的Bean实例,如果isSingleton()返回true,则该实例会放到Spring容器的单实例缓存池中. boolean isSingleton():确定由FactoryBean创建Bean的作用域是singleton还是prototype. Class getObj

mybatis防止SQL注入的方法实例详解

SQL注入是一种很简单的攻击手段,但直到今天仍然十分常见.究其原因不外乎:No patch for stupid.为什么这么说,下面就以JAVA为例进行说明: 假设数据库中存在这样的表: table user( id varchar(20) PRIMARY KEY , name varchar(20) , age varchar(20) ); 然后使用JDBC操作表: private String getNameByUserId(String userId) { Connection conn

nodejs 使用 js 模块的方法实例详解

Intro# 最近需要用 nodejs 做一个爬虫,Google 有一个 Puppeteer 的项目,可以用它来做爬虫,有关 Puppeteer 的介绍网上也有很多,在这里就不做详细介绍了. node 小白,开始的时候有点懵逼,模块导出也不会. 官方文档上说支持 *.mjs 但是还要改文件扩展名,感觉有点怪怪的,就没用,主要是基于js的模块使用. 模块导出的两种方式# 因为对 C# 比较熟悉,从我对 C# 的理解中,将 nodejs 中模块导出分成两种形式: 1.一个要实例化才能调用的模块 2.

提升python处理速度原理及方法实例

这篇文章主要介绍了提升python处理速度原理及方法实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 导读:作为日常生产开发中非常实用的一门语言,python广泛应用于网络爬虫.web开发.自动化测试.数据分析和人工智能等领域.但python是单线程的,想要提升python的处理速度,涉及到一个很关键的技术--协程.本篇文章,将讲述python协程的理解与使用. 1.操作系统相关概念 在理解与使用协程之前,先简单的了解几个与操作系统相关的概念