C#中的参数传递
方法的参数传递机制:
1.值参数 (Value Parameter)
方法名称 ( 参数类型 参数名称[,参数类型 参数名称] )
2.引用参数 (Reference Paramter)
方法名称 ( ref 参数类型 参数名称 [,ref 参数类型 参数名称] )
3.输出参数 (Out Paramter)
方法名称 ( out 参数类型 参数名称[,out 参数类型 参数名称] )
输出参数和引用参数的区别:
从CLR的角度看,关键字out和关键字ref是等效的,也就是说,无论使用哪个关键字,都会生成相同的元数据和IL代码.但是C#编译器将两个关键字区别对待,在c#中,这两个关键字的区别在于哪个方法负责初始化引用对象.
<1>若是使用的out关键字,那么调用者不希望在调用方法之前初始化对象,被调用的方法不能读取对象的值,而且被调用的方法必须在返回之前为对象赋值.
<2>若是使用的ref关键字,那么调用者必须在调用方法之前首先初始化参数的值,被调用的方法可以读取参数或为参数赋值.
例:
1.值参数、引用参数、输出参数的方法调用:
using System;
class Methord
{
public static void ValueMethord(int i) //值参数的调用
{
i++;
}
public static void ReferenceMethord(ref int i) //引用参数的调用
{
i++;
}
public static void OutMethord(out int i) //输出参数的调用
{
i=0; //注意:必须将局部变量i初始化
i++;
}
static void Main()
{
int i=0;
ValueMethord(i);
Console.WriteLine("i="+i);
int j=0; //注意:必须在此将局部变量j初始化,而不是在引用参数的调用时
ReferenceMethord(ref j);
Console.WriteLine("j="+j);
int k=0;
OutMethord(out k);
Console.WriteLine("k="+k);
}
}
2.向方法传递可变数量的参数:使用params关键字
using System;
class Methord
{
static int addi(params int[] valuse) //注意:params关键字后面必须是接一个数组型变量
{
int sum=0;
foreach(int i in valuse) //遍历数组中的每一个元素,然后求出其和的值
sum+=i;
return sum;
}
static void Main()
{
Console.WriteLine (addi(1,2,3));
}
}
3.对比值类型和引用类型:
值类型 引用类型
变量中存放的 真正的数据 指向数据的引用指针
内存空间分配 堆栈(Stack) 托管堆(Managed Heap)
内存需求 一般较小 较大
执行效能 较快 较慢
内存释放时间点 执行超过定义变量的作用域 由回收站负责回收
可以为null 不可以为null 可以为null
最后更新:2017-04-02 04:00:24