8.2 方法

视频讲解:光盘\TM\lx\8\02方法.mp4

方法是一种用于实现可以由对象或类执行的计算或操作的成员。类的方法主要是和类相关联的动作,它是类的外部界面。对于那些私有的字段来说,外部界面实现对它们的操作一般只能通过方法来实现。

方法就是为达到某种目的而采取的途径、步骤、手段等,例如以一个职员来进一步说明方法。方法先生:男,现任C#部门工程师;工作分配:用C#语言编写公司指定的项目,并对其进行测试。以上的方法先生相当于方法的名称,而工作分配相当于方法要实现的目的。

本节将对方法进行详细讲解。

8.2.1 方法的声明

方法是包含一系列语句的代码块,在C#中,每个执行指令都是在方法的上下文中完成的。

方法在类或结构中声明,声明时需要指定访问级别、返回值、方法名称及方法参数,方法参数放在括号中,并用逗号隔开。括号中没有内容表示声明的方法没有参数。

方法声明可以包含一组特性和private、public、protected、internal 4个访问修饰符的任何一个有效组合,还可以包含new、static、virtual、override、sealed、abstract以及extern等修饰符。

如果以下所有条件都为真,则表明所声明的方法具有一个有效的修饰符组合。

该声明包含一个有效的访问修饰符组合。

该声明中所包含的修饰符彼此各不相同。

该声明最多包含下列修饰符中的一个:static、virtual和override。

该声明最多包含下列修饰符中的一个:new和override。

如果该声明包含abstract修饰符,则该声明不包含下列任何修饰符:static、virtual、sealed或extern。

如果该声明包含private修饰符,则该声明不包含下列任何修饰符:virtual、override或abstract。

如果该声明包含sealed修饰符,则该声明还包含override修饰符。

方法声明的返回类型指定了由该方法计算和返回值的类型,如果该方法并不返回值,则其返回类型为void。

一个方法的名称和形参列表定义了该方法的签名,具体地讲,一个方法的签名由它的名称以及它的形参的个数、修饰符和类型组成。返回类型不是方法签名的组成部分,形参的名称也不是方法签名的组成部分。

注意 一个方法的返回类型和它的形参列表中所引用的各个类型,必须具有至少与该方法本身相同的可访问性。

对于abstract和extern方法,方法主体只包含一个分号。对于所有其他方法,方法主体由一个块组成,该块指定了在调用方法时要执行的语句。

方法的名称必须与在同一个类中声明的所有其他非方法成员的名称都不相同。此外,一个方法的签名必须与在同一个类中声明的所有其他方法的签名都不相同,并且在同一类中声明的两个方法的签名不能只有ref和out不同。

【例8.4】声明一个public类型的无返回值方法method,代码如下。

        public voidmethod()
        {
            Console.Write("方法声明");
        }

互动练习:计算器是编程初学者最常见的一个例子,很多高校通常都使用编写计算器代码来考查学生的编程能力,这里通过封装方法实现一个简单的计算器,要求在控制台中输入两个数及数学符号,通过调用方法计算相应的结果。

8.2.2 方法的参数类型

调用方法时可以给该方法传递一个或多个值,传给方法的值叫作实参,在方法内部,接收实参的变量叫作形参,形参在紧跟着方法名的括号中声明,形参的声明语法与变量的声明语法一样。形参只在括号内部有效。声明方法参数时,可以通过关键字params、ref和out实现,下面分别对这3种参数类型进行讲解。

1.params参数

params参数用来指定在参数数目可变时采用的方法参数,params参数必须是一维数组。

【例8.5】本实例声明一个静态方法UseParams,接收一个string[]类型的参数,然后利用for循环输出数组的元素。代码如下。(实例位置:光盘\TM\sl\8\2)

        static void UseParams(params string[] list)
        {
            for (int i = 0; i < list.Length; i++)
            {
              Console.WriteLine(list[i]);
            }
        }
        static void Main()
        {
            string[] strName = new string[5] { "我", "是", "中", "国", "人" };
            UseParams(strName);
            Console.Read();
        }

按Ctrl+F5键查看运行结果,如图8.2所示。

2.ref参数

ref参数使方法参数按引用传递,其效果是:当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。如果要使用ref参数,则方法声明和调用方法都必须显式使用ref关键字。

【例8.6】本实例声明一个静态方法Method,并接收一个int型的ref参数。代码如下。(实例位置:光盘\TM\sl\8\3)

        public static void Method(ref int i)
        {
            i = 44;
        }
        public static void Main()
        {
            int val = 0;
            Method(ref val);
            Console.WriteLine(val);
            Console.Read();
        }

按Ctrl+F5键查看运行结果,如图8.3所示。

图8.2 params参数的使用

图8.3 ref参数的使用

3.out参数

out关键字用来定义输出参数,它会导致参数通过引用来传递,这与ref关键字类似,不同之处在于ref要求变量必须在传递之前进行初始化,而使用out关键字定义的参数,不用进行初始化即可使用。如果要使用out参数,则方法声明和调用方法都必须显式使用out关键字。

【例8.7】本实例声明一个静态方法Method,并接收一个out类型的参数。代码如下。(实例位置:光盘\TM\sl\8\4)

        public static void Method(out int i)
        {
            i = 44;
        }
        public static void Main()
        {
            int value;
            Method(out value);
            Console.WriteLine("输出参数:"+value);
            Console.Read();
        }

按Ctrl+F5键查看运行结果,如图8.4所示。

图8.4 out参数的使用

8.2.3 方法的分类

方法分为静态方法和非静态方法,如果一个方法声明中含有static修饰符,则称该方法为静态方法。如果没有static修饰符,则称该方法为非静态方法。下面分别对静态方法和非静态方法进行介绍。

1.静态方法

静态方法不对特定实例进行操作,调用时,需要直接使用类名进行调用。

【例8.8】创建一个控制台应用程序,其中定义了一个静态的方法Add,该方法有两个参数,其返回类型为int,它主要用来实现两个整数相加的功能,然后在主函数Main中使用类名直接调用自定义的静态方法,并传递两个参数。程序代码如下。(实例位置:光盘\TM\sl\8\5)

        public static intAdd(int x, int y)                         //定义一个静态方法
        {
            return x + y;
        }
        static voidMain(string[] args)
        {
            Console.WriteLine("结果为:"+Program.Add(3, 5));        //使用类名调用静态方法
        }

按Ctrl+F5键查看运行结果,如图8.5所示。

2.非静态方法

非静态方法是对类的某个给定的实例进行操作,调用时,需要使用类的实例(对象)进行调用。

【例8.9】创建一个控制台应用程序,其中定义了一个非静态的方法Add。该方法有两个参数,其返回类型为int,它主要用来实现两个整数相加的功能,然后在主函数Main中实例化Program类的一个对象,并使用该对象名调用自定义的非静态方法,并传递两个参数。程序代码如下。(实例位置:光盘\TM\sl\8\6)

        public int Add(int x, int y)                            //定义一个非静态方法
        {
            return x + y;
        }
        static void Main(string[] args)
        {
            Program program=new Program();                      //实例化类对象
            Console.WriteLine("结果为:"+program.Add(3, 5));     //使用类对象调用定义的非静态方法
        }

说明 调用非静态方法时,也可以使用this关键字。

按Ctrl+F5键查看运行结果,如图8.6所示。

图8.5 静态方法的使用实例运行结果

图8.6 非静态方法的使用实例运行结果

8.2.4 方法的重载

方法重载是指方法名相同,但参数的数据类型、个数或顺序不同的方法。只要类中有两个以上的同名方法,但是使用的参数类型、个数或顺序不同,调用时,编译器即可判断在哪种情况下调用哪种方法。

【例8.10】创建一个控制台应用程序,其中定义了一个重载方法Add,并在Main方法中分别调用其各种重载形式对传入的参数进行计算。程序代码如下。(实例位置:光盘\TM\sl\8\7)

        pubIic static int Add(int x, int y)       //定义一个静态方法Add,返回值为int类型,有两个int类型的参数
        {
            return x + y;
        }
        pubIic doubIe Add(int x, doubIe y)        //重新定义方法Add,它与第一个的返回值类型及参数类型不同
        {
            return x + y;
        }
        pubIic int Add(int x, int y, int z)       //重新定义方法Add,它与第一个的参数个数不同
        {
            return x + y + z;
        }
        static void Main(string[] args)
        {
            Program program=new Program();        //实例化类对象
            int x = 3;
            int y = 5;
            int z = 7;
            double y2 = 5.5;
            //根据传入的参数类型及参数个数的不同调用不同的Add重载方法
            Console.WriteLine(x + "+" + y + "=" + Program.Add(x, y));
            Console.WriteLine(x + "+" + y2 + "=" + program.Add(x, y2));
            Console.WriteLine(x + "+" + y + "+" + z + "=" + program.Add(x, y, z));
        }

按Ctrl+F5键查看运行结果,如图8.7所示。

图8.7 方法的重载实例运行结果

8.2.5 Main方法

Main方法是程序的入口点,程序将在此处创建对象和调用其他方法,一个C#程序中只能有一个入口点,每新建一个项目,程序都会自动生成一个Main方法,默认的Main方法代码如下。

        static void Main(string[] args){}

说明 Main方法默认访问级别为private。

Main方法是一个特别重要的方法,使用时需要注意以下几点:

Main方法是程序的入口点,程序控制在该方法中开始和结束。

该方法在类或结构的内部声明,它必须为静态方法,而且不应该为公共方法。

它可以具有void或int返回类型。

声明Main方法时既可以使用参数,也可以不使用参数。

参数可以作为从零开始索引的命令行参数来读取。