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