C#方法
一个方法是把一些相关逻辑的语句组织在一起,用来执行一个任务的语句块。
使用方法过程
- 定义方法
- 调用方法
C#中定义方法
定义一个方法从根本上来说是声明它的结构元素,C#中定义方法的语句如下
<Access Specifier> <Return Type> <Method Name>(Parameter List)
{
Method Body
}
Access Specifier:它是一个访问修饰符,这个修饰符决定了它对另一个类的可见性
Return Type:返回值类型,一个方法可以返回一个值。如果一个方法不返回任何值则返回类型设置为void
Method name:方法名称,是一个唯一的标识符,且是大小写敏感的。它不能与类中声明的其它标识符相同。
Parameter list:参数列表,使用圆括号括起来,参数是用来传递和接收方法的数据,参数列表包含了参数的类型、顺序和数量。这里的参数是可选的,一个方法可以没有任何方法
Method body:方法的主体部分,也就是方法要实现的逻辑
在visual studio当中新建一个项目,在新建的项目中可以添加如下方法
/**
* 最后修改时间:2018-09-13
* 最后修改人:xiesheng
* 函数名称:findMax
* 返回值类型:int
* 参数说明:ArrayList
* 函数说明:用来获取一个ArrayList<int>中各个元素的最大值并返回
*/
public static int FindMax(ArrayList arr)
{
/*声明一个局部变量*/
int max = 0;
foreach (int i in arr)
{
if (max < i)
{
max = i;
}
}
return max;
}
C#中对方法的调用
在Main方法中添加如下代码:
/*主函数*/
static void Main(string[] args)
{
ArrayList arr = new ArrayList();
arr.Add(12);
arr.Add(10);
arr.Add(-2);
arr.Add(9);
Console.WriteLine("max = {0}", FindMax(arr));
Console.ReadKey();
}
编译执行后结果如下:
上面的过程是把findMax()方法和Main()方法放在同一个类中,也可以把方法单独放在一个类当中,然后在Main()方法中实列化这个类,然后调用这个类的方法(可参考C#每日一课十)。
C#中递归方法调用
当一个方法进行自我调用时,这个就是所谓的递归。
新增一个计算阶乘的方法如下:
/**
* 最后修改时间:2018-09-13
* 最后修改人:xiesheng
* 函数名称:factorial
* 返回值类型:long
* 参数说明:int
* 函数说明:返回指定数量的阶乘值
*/
public static long Factorial(int num)
{
/*局部变量*/
long result = 0;
if (num == 1)
{
result = 1;
}
else
{
result = Factorial(num - 1) * num;
}
return result;
}
此方法在Main方法中做如下调用:
/*验证递归调用*/
Console.WriteLine("1的阶乘是:{0}", Factorial(1));
Console.WriteLine("6的阶乘是:{0}",Factorial(6));
Console.WriteLine("7的阶乘是:{0}", Factorial(7));
Console.WriteLine("8的阶乘是:{0}", Factorial(8));
编译运行后的结果如下:
C#中参数传递
C#中有三种向方法传递参数的方式
- 值参数
这种方式会复制参数的实际值给到函数的形式参数,实参和形参使用的是两个不同的内存中的值。在这种情况下,当形参的值发生改变时,不会影响到实参值从而保证了实参数据的安全。
- 引用参数
这种方式复制参数的内存位置的引用给形式参数。意味着,当形参的值发改变 的时候同时也会改变实参的值。
- 输出参数
可以用来返回多个值
按值传递参数
这种传递方式是默认的传递方式,当调用一个方法时,会为每个值参数创建一个新的存储位置。
实参的值会复制给到形参,实参与形参两者使用的是两个不同的内存中的值。所以,当形参值发生改变时,不会影响到实参的值,从而保证实参数据的安全性。
在类中加入如下方法:
// 值传递函数
public static void Swap(int x, int y) {
int temp;
temp = x;
x = y;
y = temp;
Console.WriteLine("函数交换后在方法中的值如下:x={0},y={1}",x,y);
}
在Main方法中做如下调用方法:
int x = 100, y = 200;
//值传递调用
Console.WriteLine("--------------值传递调用----------------");
Console.WriteLine("函数执行交换前的值如下:x={0},y={1}",x,y);
Swap(x, y);
Console.WriteLine("函数执行交换后的值如下:x={0},y={1}", x, y);
编译执行后的结果如下:
从上面的结果可以看到,在方法调用前后方法调用后实参的值是没有做任何变化的,但在方法中做了形参内容的主变化。
按引用传递参数
引用参数是一个对变量的内存位置的引用。当使用引用传递参数值时,与值参数不同的是,它不会为形参创建新的存储位置。引用参数表示提供给方法的实际参数具有相同的内存位置。
在C#中使用ref关键字来声明引用参数。
在类中新增方法如下:
// 引用参数
public static void Swap(ref int x, ref int y) {
int temp;
temp = x;
x = y;
y = temp;
Console.WriteLine("函数交换后在方法中的值如下:x={0},y={1}", x, y);
}
在Main方法中调用这个引用传参方法
//引用传递调用
Console.WriteLine("--------------引用传递调用----------------");
Console.WriteLine("函数执行交换前的值如下:x={0},y={1}", x, y);
Swap(ref x, ref y);
Console.WriteLine("函数执行交换后的值如下:x={0},y={1}", x, y);
编译执行结果如下:
从执行的结果可以看到,在方法中对参数的改变最终影响到了实参的值,因为这个时候使用引用传参会使形参和实参指向同一个内存地址,当形参改变的时对应内存地址上的值就是发生变化。
按输出参数传递参数
在方法中return语句只可以返回一个值。但是可以使用输出参数来返回两个值。输出参数会把方法输出的数据赋给自己,其它的方面与引用参数类似。
在类中添加如下方法:
//输出参数
public static int MaxAndMin(out int min, ArrayList list) {
int max;
max = Int32.Parse(list[0].ToString());
foreach(int i in list) {
if (max <= i) {
max = i;
}
}
min = Int32.Parse(list[0].ToString());
foreach (int i in list) {
if (min >= i) {
min = i;
}
}
return max;
}
在Main方法加入如下代码进行方法调用:
//输出参数
Console.WriteLine("--------------输出参数调用----------------");
ArrayList arr1 = new ArrayList();
arr1.Add(100);
arr1.Add(38);
arr1.Add(-2);
arr1.Add(98);
int min = 0, max = 0;
max = MaxAndMin(out min,arr1);
Console.WriteLine("调用方法前数组中最大值:{0}",max);
Console.WriteLine("调用方法前数组中最小值:{0}",min);
编译运行后结果如下:
其中可以看到,方法在具有返回值的同时,可以在参数中加入输出参数(out标识符标识)。