参考书:《 visual C# 从入门到精通》
第一部分 Visual C# 和Visual Studio 2015概述
第3章 方法和作用域
文章目录
3.1 创建方法
C#的方法也就是函数的意思。通常创建一个方法需要有:返回类型、方法名、参数列表、方法主体语句。如果一个方法不反回任何值要用关键字void
。
3.1.2从方法返回数据
用return
返回特定类型的值。
3.1.3 使用表达式主体方法
对于很简单的方法,C#允许一种简化的形式:
int addValues(int leftHandSide,int rightHandSide)=>leftHandSize+rightHandSize;
void showResult(int answer)=>Console.WriteLine($"The answer is {answer}");
这种形式感觉还是很有特色的。
3.1.4 调用方法
3.2 使用作用域
3.2.1 定义局部变量
方法主体中声明的任何变量都具有方法的作用域,它们只能由方法内部的代码访问,即局部变量。
3.2.2 定义类作用域
在类主体中声明的任何变量都具有类的作用域。类定义的变量称为字段。和局部变量相反,可用字段在不同方法之间共享信息。
3.2.3 重载方法
重载允许多个方法同名但参数类型不完全相同,编译器根据参数类型来区分。(同C++)
3.3 编写方法
下面我们创建方法来计算一名顾问的收费金额。代码如下:
using System;
namespace c_3_3
{
class Program
{
static void Main(string[] args)
{
new Program().run();
}
void run()
{
double dailyRate = readDouble("Enter your daily rate:");
int noOfDays = readInt("Enter the numer of days:");
writeFee(CalculateFee(dailyRate, noOfDays));
}
private void writeFee(double v) => Console.WriteLine($"The consultant's fee is :{v * 1.1}");
private double CalculateFee(double dialyRate, int noOfDays) => dialyRate * noOfDays;
private int readInt(string v)
{
Console.Write(v);
String line = Console.ReadLine();
return int.Parse(line);
}
private double readDouble(string v)
{
Console.Write(v);
String line = Console.ReadLine();
return double.Parse(line);
}
}
}
有个小技巧是,我们可以先创建方法run:
void run()
{
double dailyRate = readDouble("Enter your daily rate:");
int noOfDays = readInt("Enter the numer of days:");
writeFee(CalculateFee(dailyRate, noOfDays));
}
然后右击各个方法名选择菜单中的快速操作和重构,vs会自动生成各个方法的包括返回类型、方法名、参数列表,我们只需要修改方法的主体语句就行了。
3.4 使用可选参数和具体参数
3.4.1 定义可选参数
void optMethod(int first,double secon=0.0,string third="Hello"){
...
}
3.4.2 传递具名参数
可以这样调用:
optMethod(first:99,second:123.45,Third:"World");
optMethod(first:100,second:54.321);
3.4.3 消除可选参数和具名参数的歧义
使用可选参数和具名参数,重载时可能会造成歧义。比如:
void optMethod(int f,double s=0.0,string t="hello"){
...
}
void optMethod(int f,double s=0.0,string t="hello",int fourth=100){
...
}
上面的代码时完全合法的,但如果调用optMethod方法时就可能出问题:
optMethod(1,2.5,"world");
上述代码是合法的,调用的版本选择和方法调用最匹配的。但如果是:
optMethod(1,2.5);
编译器两个版本都不选,直接不允许编译。