C#编程中使用ref和out关键字来传递数组对象的用法
在C#中,数组实际上是对象,而不只是像C和C++中那样的可寻址连续内存区域。Array是所有数组类型的抽象基类型。可以使用Array具有的属性以及其他类成员。这种用法的一个示例是使用Length属性来获取数组的长度。下面的代码将numbers数组的长度(为5)赋给名为lengthOfNumbers的变量:
int[]numbers={1,2,3,4,5}; intlengthOfNumbers=numbers.Length;
Array类提供了许多其他有用的方法和属性,用于排序、搜索和复制数组。
示例
此示例使用Rank属性来显示数组的维数。
classTestArraysClass { staticvoidMain() { //Declareandinitializeanarray: int[,]theArray=newint[5,10]; System.Console.WriteLine("Thearrayhas{0}dimensions.",theArray.Rank); } }
输出:
Thearrayhas2dimensions.
使用ref和out传递数组
与所有out参数一样,在使用数组类型的out参数前必须先为其赋值;即必须由被调用方为其赋值。例如:
staticvoidTestMethod1(outint[]arr) { arr=newint[10];//definiteassignmentofarr }
与所有ref参数一样,数组类型的ref参数必须由调用方明确赋值。因此,不需要由被调用方明确赋值。可以将数组类型的ref参数更改为调用的结果。例如,可以为数组赋以null值,或将其初始化为另一个数组。例如:
staticvoidTestMethod2(refint[]arr) { arr=newint[10];//arrinitializedtoadifferentarray }
下面两个示例演示了out与ref在将数组传递给方法时的用法差异。
在此示例中,在调用方(Main方法)中声明数组theArray,并在FillArray方法中初始化此数组。然后,数组元素将返回调用方并显示。
classTestOut { staticvoidFillArray(outint[]arr) { //Initializethearray: arr=newint[5]{1,2,3,4,5}; } staticvoidMain() { int[]theArray;//Initializationisnotrequired //Passthearraytothecalleeusingout: FillArray(outtheArray); //Displaythearrayelements: System.Console.WriteLine("Arrayelementsare:"); for(inti=0;i<theArray.Length;i++) { System.Console.Write(theArray[i]+""); } //Keeptheconsolewindowopenindebugmode. System.Console.WriteLine("Pressanykeytoexit."); System.Console.ReadKey(); } }
输出:
Arrayelementsare: 12345
在此示例中,在调用方(Main方法)中初始化数组theArray,并通过使用ref参数将其传递给FillArray方法。在FillArray方法中更新某些数组元素。然后,数组元素将返回调用方并显示。
classTestRef { staticvoidFillArray(refint[]arr) { //Createthearrayondemand: if(arr==null) { arr=newint[10]; } //Fillthearray: arr[0]=1111; arr[4]=5555; } staticvoidMain() { //Initializethearray: int[]theArray={1,2,3,4,5}; //Passthearrayusingref: FillArray(reftheArray); //Displaytheupdatedarray: System.Console.WriteLine("Arrayelementsare:"); for(inti=0;i<theArray.Length;i++) { System.Console.Write(theArray[i]+""); } //Keeptheconsolewindowopenindebugmode. System.Console.WriteLine("Pressanykeytoexit."); System.Console.ReadKey(); } }
输出:
Arrayelementsare: 11112345555