C#方法(Method)

3109 更新于: 2021-07-17 读完约需 5 分钟

概述

之前我们所有的示例程序中,代码都是写在了一个名为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#语言中所有类型或者类型成员拥有的可以被访问的级别,将在后续的章节中具体讲解。

  • 返回类型: 返回类型是方法返回的值的数据类型,可以是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

版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。

本文永久链接码友网 » C#程序设计基础(入门篇) » C#方法(Method) 分享:

发表评论

登录用户才能发表评论, 请 登 录 或者 注册