CH10_方法


本章目标

  • 掌握无参方法和带参方法的区别
  • 掌握无返回值类型和有返回值类型方法的区别
  • 掌握方法重载的应用

方法概述

在我们学习 C# 语言的过程中会发现之前的应用程序中默认会生成一个主方法 Main(),它是执行程序的入口和出口。

方法是将完成同一功能的内容放到一起,方便书写和调用的一种方式,也体现了面向对象语言中封装的特性。

语法

1
2
3
4
访问修饰符    修饰符    返回值类型    方法名(参数列表)
{
语句块;
}

1.访问修饰符

​ 所有类成员访问修饰符都可以使用,如果省略访问修饰符,默认是 private。

2.修饰符

​ 在定义方法时修饰符包括 virtual(虚拟的)、abstract(抽象的)、override(重写的)、static(静态的)、sealed(密封的)。override 是在类之间继承时使用的。

3.返回值类型

​ 用于在调用方法后得到返回结果,返回值可以是任意的数据类型,如果指定了返回值类型,必须使用 return 关键字返回一个与之类型匹配的值。如果没有指定返回值类型,必须使用 void 关键字表示没有返回值。

4.方法名

​ 对方法所实现功能的描述。方法名的命名是以 Pascal 命名法为规范的。

5.参数列表

​ 在方法中允许有 0 到多个参数,如果没有指定参数也要保留参数列表的小括号。参数的定义形式是“数据类型参数名”,如果使用多个参数,多个参数之间需要用逗号隔开。

无参方法

1.定义无参无返回值方法

定义一个生成4位随机数的方法。

1
2
3
4
5
6
7
public void BuilderNum()
{
Random d = new Random();
int num= d.Next(1000, 9999);

Console.WriteLine(num);
}

2.定义无参无有返回值方法

1
2
3
4
5
6
7
public int BuilderNum()
{
Random d = new Random();
int num= d.Next(1000, 9999);

return num;
}

使用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Program
{
static void Main(string[] args)
{

Test1 t = new Test1();

//t.BuilderNum();


int num=t.BuilderNum();
Console.WriteLine("随机数:"+num);

Console.ReadLine();
}
}

有参方法

1.定义有参无返回值方法

定义一个方法实现,计算长方形的周长。

1
2
3
4
5
6
public void CalcPerimeter(int a,int b)
{
int s = (a + b) * 2;

Console.WriteLine("周长:"+s);
}

2.定义有参有返回值方法

1
2
3
4
5
6
public int CalcPerimeter(int a,int b)
{
int s = (a + b) * 2;

return s;
}

使用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Program
{
static void Main(string[] args)
{

Test1 t = new Test1();

//t.CalcPerimeter(10, 5);

int s=t.CalcPerimeter(10, 5);
Console.WriteLine("周长:"+s)

Console.ReadLine();
}
}

可变参数

params 是C#开发语言中关键字, params主要的用处是在给函数传参数的时候用,就是当函数的参数不固定的时候。 在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字.

可变参数特点:

1、若形参中含一个参数数组,则该参数数组必须位于形参列表的最后。

2、不允许将params修饰符与ref和out修饰符组合起来使用。

3、参数数组必须是一维数组。

4、与参数数组对应的实参可以是同一类型的数组,也可以是任意多个与该数组的元素属于同一类型的变量。

5、若实参是数组则按引用传递,若实参是变量或表达式则按值传递。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Program
{
static void Main(string[] args)
{
int[] ar = { 22,14,65,21};

GetMax(23, 45, 65, 77);

GetMax(ar);

Console.ReadLine();
}

//可变参数
static void GetMax(params int[] array)
{
if (array.Length == 0) return;

int max = array[0];

for (int i = 1; i < array.Length; i++)
{
if (array[i]>max)
{
max = array[i];
}
}
Console.WriteLine(max);
}

}

可选参数

可选参数是说方法在调用传入值的时候,可以选择传入实参可以不传.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Program
{
static void Main(string[] args)
{
Show("张三", 22, 172);

Show("张三", 22, 172,"女");

Console.ReadLine();
}

//可选参数只能放在最后
static void Show(string name ,int age,double height,string sex="男")
{
Console.WriteLine("姓名:{0},年龄:{1},身高:{2},性别:{3}",name,age,height,sex);
}
}

命名参数

实参的位置可以不和相应形参一一对应。

命名参数在方法生命的时候没有什么不同,但是在调用的时候需要 如下调用方式

    f.fun ( a : 12, b : 10 );

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Program
{
static void Main(string[] args)
{
//调用方法时不用关系参数顺序
Show(age: 21, height: 172, name: "李四");

Console.ReadLine();
}

static void Show(string name ,int age,double height)
{
Console.WriteLine("姓名:{0},年龄:{1},身高:{2}",name,age,height);
}
}

方法重载

参数列表不同主要体现在参数个数或参数的数据类型不同。在调用重载的方法时系统是根据所传 递参数的不同判断调用的是哪个方法。

案例1: 创建一个名为 SumUtils 的类,在类中分别定义计算两个整数、两个小数、 两个字符串类型的和,以及从 1 到给定整数的和。在 Main 方法中分别调用定义好的方法。

定义方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class SumUtils
{
public int Sum(int a,int b)
{
return a + b;
}
public double Sum(double a,double b)
{
return a + b;
}
public string Sum(string a,string b)
{
return a + b;
}
public int Sum(int a)
{
int sum = 0;
for(int i = 1; i < a; i++)
{
sum += i;
}
return sum;
}
}

调用方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Program
{
static void Main(string[] args)
{
SumUtils s = new SumUtils();
//调用两个整数求和的方法
Console.WriteLine("两个整数的和为:" + s.Sum(3, 5));
//调用两个小数求和的方法
Console.WriteLine("两个小数的和为:" + s.Sum(3.2, 5.6));
//调用两个字符串连接的方法
Console.WriteLine("连个字符串的连接结果为:" + s.Sum("C#", "方法重载"));
//输出 1 到 10 的和
Console.WriteLine("1 到 10 的和为:" + s.Sum(10));
}
}

在调用 Sum 时只是传递的参数不同,系统会自动识别参数来调用正确的方法。

案例2: 定义一个 SayHello 的类,在类中分别定义 3 个构造方法,一个是不带参数 的构造方法,用于打印“Hello”; 一个是带一个参数的构造方法传递一个用户名,用于打 印“Hello Army”(Army 为传入的用户名);一个是带两个参数的构造方法传递一个用户名 和年龄,用于打印“Hello Army,20”(Army 为传入的用户名、20 为传入的年龄)。在 Main 方法中使用不同的构造器创建 SayHello 类的对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class SayHello
{
public SayHello()
{
Console.WriteLine("Hello");
}
public SayHello(string name)
{
Console.WriteLine("Hello " + name);
}
public SayHello(string name, int age)
{
Console.WriteLine("Hello " + name + "," + age);
}
}

1
2
3
4
5
6
7
8
9
10
class Program
{
static void Main(string[] args)
{
SayHello say1 = new SayHello();
SayHello say2 = new SayHello("小明");
SayHello say3 = new SayHello("张三", 20);
}
}

作业

1.定义一个圆柱体计算类CircularCalc,

​ 包含计算总面积的方法Area(int r,int h)

​ 包含计算总体积的方法Volume(int r,int h)

编写测试类,完成测试。

2.定义一个长方体计算类CuboidCalc,

​ 包含长(L)、宽(W)、高(H)属性

​ 包含计算总面积的方法Area()

​ 包含计算总体积的方法Volume()

编写测试类,完成测试。