概述
之前我们所有的示例程序中,代码都是写在了一个名为Main()
的代码块中。虽然这对于我们用来学习早期概念的简单程序来说已经足够了,那么是不是我们所有的代码都必须放到这个Main()
方法中才可以呢?如果是这样,那在一个大型项目中,我们的Main()
方法的代码是不是要写上万甚至百万行,这样世界就乱套了?
答案是否定的
我们可以使用类和方法来管理和维护代码。本节我们将学习到以下内容:
- 如何定义一个C#的方法(了解方法的语法结构)
- 如何调用方法
方法(Method)的定义
在C#编程语言中,方法(Method)是包含一系列语句的代码块。程序通过调用方法并指定所需的方法参数来执行语句。其他部分开发语言也有类似的“方法”结构体,如Java中也叫做方法,但在C或者JavaScript中叫做函数(function),方法是类(class)或者结构(struct)的成员,不能被定义在另一个方法中。
注意:本节讨论的是指定名称的方法,匿名方法不在本节的讨论范围。
方法的语法结构
[<Access Specifier>] <Return Type> <Method Name>([Parameter List])
{
//方法体
}
可能你看到这个语法结构还是蒙圈的状态,没关系,我们先结合一个最简单的定义方法的示例可套用这个语法结构模板:
private static void SayHi()
{
Console.WriteLine("你好,欢迎学习C#语言程序设计基础课程。");
}
语法结构解析图:
访问修饰符(可选):是C#语言中所有类型或者类型成员拥有的可以被访问的级别,将在后续的章节中具体讲解。
返回类型: 返回类型是方法返回的值的数据类型,可以是C#支持的任意数据类型。如果该方法不返回任何值,则返回类型为
void
方法名称: 方法名称可以重复(并且区分大小写),但同一个类或者结构中的方法签名不允许重复,方法签名是唯一的标识符。它不能与类中声明的任何其他标识符相同,命名方法名称时应尽量有意义,命名规则使用PascalCase(帕斯卡)命名法
参数列表: 调用方法时需要传入的参数,位于方法名称后的一对中括号内。参数列表指的是方法参数的类型、顺序和数量。参数是可选的;也就是说,一个方法可能不包含参数,参数名使用camelCase命名法
方法体: 它包含完成所需活动所需的指令集(代码块)
方法的定义和调用
我们在Main()
方法中直接调用上面的示例方法SayHi()
:
static void Main()
{
SayHi();
Console.ReadLine();
}
只有声明的方法才能被调用
其实,这里的Console.ReadLine()
也是方法的调用,只是ReadLine()
这个方法位于.NET内置的命名空间System
的控制台Console
类中而已,并且ReadLine()
方法是一个静态的方法。关于命名空间和类,我们将在后续的课程中专门作详细的介绍。
方法的实际使用案例
接下来,我们用一个实际案例来分析为什么我们要使用方法(方法给开发人员带来哪些好处)。
这是一个比较两个数大小的问题。有两个任意整数,要求使用C#实现比较这两个数的大小,并在控制台输出较大的那个。
不使用方法封装实现两个数比较大小
int x,y;
x = 2;
y = 3;
int max;
if (x >= y)
{
max = x;
}
else
{
max = y;
}
Console.WriteLine("x={0},y={1},较大数为:{2}",x,y,max);
x = 5;
y = 1;
max = 0;
if (x >= y)
{
max = x;
}
else
{
max = y;
}
Console.WriteLine("x={0},y={1},较大数为:{2}", x, y, max);
Console.ReadLine();
使用方法封装实现两个数比较大小
static void Main(string[] args)
{
int x, y;
x = 2;
y = 3;
int max = FindMax(x,y);
Console.WriteLine("x={0},y={1},较大数为:{2}", x, y, max);
x = 50;
y = 20;
max = FindMax(x,y);
Console.WriteLine("x={0},y={1},较大数为:{2}", x, y, max);
// 或者不使用中间变量,直接调用方法
x = 2;
y = 3;
Console.WriteLine("x={0},y={1},较大数为:{2}", x, y, FindMax(x, y));
x = 50;
y = 20;
Console.WriteLine("x={0},y={1},较大数为:{2}", x, y, FindMax(x, y));
Console.ReadLine();
}
static int FindMax(int x,int y)
{
int max;
if (x >= y)
{
max = x;
}
else
{
max = y;
}
return max;
}
有参数的方法定义示例(一个参数,无返回值):
private static void SayHi(string customerName)
{
Console.WriteLine("你好,{0}",customerName);
}
无返回值:不需要知道这个方法执行后的结果是什么,确保这个方法正确执行就好了。
有返回值:需要知道这个方法执行后的结果是什么,请在这个方法的方法体逻辑执行完成后使用关键字return
将结果返回给调用者。
如果返回类型为void
,则可以使用return
关键字结果当前方法体,返回到调用方法的位置。
以上是一个参数的情况,那么如果我们需要传递两个参数呢?
有参数的方法定义示例(两个参数,有返回值):
private static int Sum(int x,int y)
{
int result = x + y;
return result;
}
直接调用方法
Console.WriteLine(Sum(2,3));
将一个方法的返回值赋给变量
int sum = Sum(2,3);
Console.WriteLine(sum);
方法的参数可以是表达式
int sum = Sum((2*3),3);
Console.WriteLine(sum);
方法的重载
方法的重载是指:方法名相同,但是参数的个数和类型不同。方法的重载与返回值无关,与参数的个数和类型有关。
static double FindMax(double x,double y)
{
double max;
if (x >= y)
{
max = x;
}
else
{
max = y;
}
return max;
}
仅方法名相同参数列表相同,但返回值类型不同的方法不能构成重载。
类中的构造函数也可以实现重载,是方法重载的一种特殊形式。(类的章节将详细介绍)
可选参数和命名参数
从C# 4.0开始,便支持可选参数和命名参数。先看以下方法声明:
/// <summary>
/// 打招呼的方法(命名参数)
/// </summary>
/// <param name="username"></param>
/// <param name="greeting"></param>
static void SayHiNamed(string username, string greeting)
{
Console.WriteLine("{0}, {1}", greeting, username);
}
/// <summary>
/// 打招呼的方法(可选参数及参数默认值)
/// </summary>
/// <param name="username"></param>
/// <param name="greeting"></param>
static void SayHiOptional(string username, string greeting = "Hi")
{
Console.WriteLine("{0}, {1}", greeting, username);
}
/// <summary>
/// 打招呼的方法(可选参数)
/// </summary>
/// <param name="username"></param>
/// <param name="greeting"></param>
static void SayHi(string username = "Unknown", string greeting = "Hi",bool showGreeting = true)
{
if (!showGreeting)
{
Console.WriteLine("{0}", username);
}
else
{
Console.WriteLine("{0}, {1}", greeting, username);
}
}
调用示例:
Console.WriteLine("*********命名参数**********");
SayHiNamed("Rector", "Hi");
SayHiNamed(greeting: "Hello", username: "Rector");
Console.WriteLine("**********可选参数**********");
SayHiOptional("Rector");
SayHiOptional("Rector", "你好");
SayHiOptional(greeting: "Hello", username: "Rector");
Console.WriteLine("**********默认参数值**********");
SayHi();
SayHi("Rector");//SayHi(username: "Rector");
SayHi("Rector", "Hello");
SayHi(greeting: "Hello");
SayHi(greeting: "Hello", username: "Liu");
SayHi(username: "Liu", showGreeting: false);
输出:
**********命名参数********** Hi, Rector Hello, Rector **********可选参数********** Hi, Rector 你好, Rector Hello, Rector **********默认参数值********** Hi, Unknown Hi, Rector Hello, Rector Hello, Unknown Hello, Liu Liu
发表评论
登录用户才能发表评论, 请 登 录 或者 注册