数组
c#中数组声明[]必须跟在类型后面:int [] arr;arr = new int[ 5 ];
java中的声明 int arr[];在c#中无效;
c#中,数组都是对象,不象c,c++中是连续可寻址的内存区域.c#中所有数组都是从Array抽象基类继承而来.所有数组都可以使用Array的属性成员.如用length属性获取数组长度.
向某个方法传递参数时,可以通过值或通过引用传递参数。值参数简单地采用任意变量的值,在方法中使用。因此,调用代码中的变量值不受对方法内的参数所执行的操作的影响。
而引用参数指向在调用代码中声明的变量,因此,通过引用传递时方法将修改此变量的内容。
通过引用传递
在 Java 和 C# 中,引用某个对象的方法参数总是通过引用传递,而基元数据类型参数则通过值传递。
在 C# 中,所有参数在默认情况下均通过值传递。若要通过引用传递,您需要指定关键字 ref 或 out。这两个关键字的区别在于参数初始化的不同。ref 参数必须在使用前进行初始化,而 out 参数不必在传递前进行显式初始化,并且它将忽略以前的任何值。
out ref使用
ref关键字使用 :
如果想让被调用方法永久更改用作参数的变量的值时,请在参数中指定 ref 关键字。这种做法传递的不是调用中所使用的变量的值,而是对此变量本身的引用。方法随后会处理此引用,因此在方法执行期间对此参数所做的更改将保存到用作此方法的参数的原始变量中。
out 关键字
out 关键字的作用与 ref 关键字非常相似,并且对使用 out 关键字声明的参数所做的更改将在方法之外体现出来。out 关键字与 ref 关键字有两点不同:(1) 方法中将忽略 out 参数的任何初始值;(2) 必须在方法调用过程中为 out 参数赋值
与所有的out参数一样,数组类型的out参数必须在使用前为数组赋值.
ref参数 有调用方赋值,调用后保存修改后的结果,
示例:
class TestOut
{
static void FillArray(out int[] arr)
{
// 初始化数组
arr = new int[5] { 1, 2, 3, 4, 5 };
}
static void Main()
{
int[] theArray; // 没有被初始化
// 数组初始化前不能使用,通过out传递数组:
FillArray(out theArray);
// 打印数组元素
System.Console.WriteLine("Array elements are:");
for (int i = 0; i < theArray.Length; i++)
{
System.Console.Write(theArray[i] + " ");
}
}
}
ref
class TestRef{ static void FillArray(ref int[] arr){ // Create the array on demand:if (arr == null){ arr = new int[10]; } // Fill the array:arr[0] = 1111;arr[4] = 5555; }static void Main(){ // Initialize the array:int[] theArray = { 1, 2, 3, 4, 5 }; // Pass the array using ref:FillArray(ref theArray); // Display the updated array:System.Console.WriteLine("Array elements are:");for (int i = 0; i < theArray.Length; i++){System.Console.Write(theArray[i] + " ");}}}
param关键字
c#中允许声明方法时通过param关键字来向这个方法传递数目不确定的参数.方法的参数列表允许其他常规参数,但是param参数必须放在参数列表的最后,param声明的参数采用可变的数组形式.每个方法只能有一个param参数.
编译器调用方法时,将会调用于与参数相匹配的方法,如果没有找到,则会调用相匹配的带有param参数的方法,将其他参数放入一个可变数组中.
示例:
class TestParams
{
private static void Average(string title, params int[] values)
{
int sum = 0;
System.Console.Write("Average of {0} (", title);
for (int i = 0; i < values.Length; i++)
{
sum += values[i];
System.Console.Write(values[i] + ", ");
}
System.Console.WriteLine("): {0}", (float)sum/values.Length);
}
static void Main()
{
Average ("List One", 5, 10, 15);
Average ("List Two", 5, 10, 15, 20, 25, 30);
}
}