C#学习笔记_3

方法参数的种类:

C#语言的方法可以使用如下四种参数(请注意和参数类型的区别):
􀁺 值参数,不含任何修饰符。
􀁺 引用参数,以ref修饰符声明。
􀁺 输出参数,以out修饰符声明。
􀁺 数组参数,以params修饰符声明。

1. 值参数
当用值参数向方法传递参数时,程序给实参的值做一份拷贝,并且将此拷贝传递给该方法,被调用的方法不会修改实参的值,所以使用值参数时,可以保证实参的值是安全的。如果参数类型是引用类型,例如是类的引用变量,则拷贝中存储的也是对象的引用,所以拷贝和实参引用同一个对象,通过这个拷贝,可以修改实参所引用的对象中的数据成员。

2. 引用参数
有时在方法中,需要修改或得到方法外部的变量值,C语言用向方法传递实参指针来达到目的,C#语言用引用参数。当用引用参数向方法传递实参时,程序将把实参的引用,即实参在内存中的地址传递给方法,方法通过实参的引用,修改或得到方法外部的变量值。引用参数以ref修饰符声明。注意在使用前,实参变量要求必须被设置初始值。

3. 输出参数
为了把方法的运算结果保存到外部变量,因此需要知道外部变量的引用(地址)。输出参数用于向方法传递外部变量引用(地址),所以输出参数也是引用参数,与引用参数的差别在于调用方法前无需对变量进行初始化。在方法返回后,传递的变量被认为经过了初始化。值参数、引用参数和输出参数的使用见下例:
using System;
class g{public int a=0;}   //类定义
class Class1
{ public static void F1(ref char i)  //引用参数
{ i='b';}
public static void F2(char i)    //值参数,参数类型为值类型
{ i='d';}
public static void F3(out char i)  //输出参数
{ i='e';}
public static void F4(string s)   //值参数,参数类型为字符串
{ s="xyz";}
public static void F5(g gg)   //值参数,参数类型为引用类型

{ gg.a=20;}
public static void F6(ref string s)   //引用参数,参数类型为字符串
{ s="xyz";}
static void Main(string[] args)
{ char a='c';
string s1="abc";
F2(a);   //值参数,不能修改外部的a
Console.WriteLine(a);    //因a未被修改,显示c
F1(ref a);   //引用参数,函数修改外部的a的值
Console.WriteLine(a);    //a被修改为b,显示b
Char j;
F3(out j);   //输出参数,结果输出到外部变量j
Console.WriteLine(j);   //显示e
F4(s1);   //值参数,参数类型是字符串,s1为字符串引用变量
Console.WriteLine(s1);  //显示:abc,字符串s1不被修改
g g1=new g();
F5(g1);  //值参数,但实参是一个类引用类型变量
Console.WriteLine(g1.a.ToString());  //显示:20,修改对象数据
F6(ref s1);   //引用参数,参数类型是字符串,s1为字符串引用变量
Console.WriteLine(s1);    //显示:xyz,字符串s1被修改
}
}
4. 数组参数
数组参数使用params说明,如果形参表中包含了数组参数,那么它必须是参数表中最后一个参数,数组参数只允许是一维数组。比如string[]和string[][]类型都可以作为数组型参数。最后,数组型参数不能再有ref和out修饰符。见下例:
using System;
class Class1
{ static void F(params int[] args)//数组参数,有params说明
{ Console.Write("Array contains {0} elements:",args.Length);
foreach (int i in args)
Console.Write(" {0}",i);
Console.WriteLine();
}
static void Main(string[] args)
{ int[] a = {1,2,3};
F(a); //实参为数组类引用变量a
F(10, 20, 30, 40);//等价于F(new int[] {60,70,80,90});
F(new int[] {60,70,80,90});  //实参为数组类引用
F();  //等价于F(new int[] {});
F(new int[] {});  //实参为数组类引用,数组无元素
}
}
程序输出

Array contains 3 elements: 1 2 3
Array contains 4 elements: 10 20 30 40
Array contains 4 elements: 60,70,80,90
Array contains 0 elements:
Array contains 0 elements:
方法的参数为数组时也可以不使用params,此种方法可以使用一维或多维数组,见下例:
using System;
class Class1
{ static void F(int[,] args)//值参数,参数类型为数组类引用变量,无params说明
{ Console.Write("Array contains {0} elements:",args.Length);
foreach (int i in args)
Console.Write(" {0}",i);
Console.WriteLine();
}
static void Main(string[] args)
{ int[,] a = {{1,2,3},{4,5,6}};
F(a);//实参为数组类引用变量a
//F(10, 20, 30, 40);//此格式不能使用
F(new int[,] {{60,70},{80,90}});//实参为数组类引用
//F();//此格式不能使用
//F(new int[,] {});//此格式不能使用
}
}
程序输出
Array contains 3 elements: 1 2 3 4 5 6
Array contains 4 elements: 60,70,80,90

posted @ 2016-07-07 13:02  遇见美好  阅读(172)  评论(0编辑  收藏  举报