c#方法参数ref和out区别
params 关键字可以指定采用数目可变的参数的 方法参数。
可以发送参数声明中所指定类型的逗号分隔的参数列表或指定类型的参数数组。 还可以不发送参数。
在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字。
class Program
{
staticvoidMain()
{
TestClass.Useparams(1, 'a',"test");//不同类型的数据
Console.ReadKey();
}
}
publicclassTestClass
{
publicstaticvoidUseparams(params object[]list)
{
for(int i = 0; i < list.Length; i++)
{
Console.Write(list[i] + " ");
}
Console.WriteLine();
}
}
ref 关键字会导致通过引用传递的参数,而不是值。 通过的效果引用指向该参数的任何更改。方法反映在基础参数变量在被调用的方法上。 引用参数的值与基础参数变量的值始终是一样的。
class TestRef
{
static void Test(ref int i)
{
i = i +1;
}
static void Main()
{
int val = 2;
Test (refval);
Console.WriteLine(val);
//输出3
}
}
out 关键字会导致参数通过引用来传递。 这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。 若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字。
class TestOut
{
static void Test(out int i)
{
i = 1;
}
static void Main()
{
int value; // int val = 2这是ref的写法 必须先初始化
Test (out value);
// value is now 1
}
}
以上是根据c#参考文档整理
下面我自己的理解
Out在此处必须先赋值 而ref不需要
而调用时候应为out已经有值了所有可以直接用
而ref根本没有值使用时必须先定义值
(很容易理解的 out就是我会写代码你直接叫我写我就马上写
Ref就是 我还不会写代码 你叫我写 那你先教会我写)
class Program
{
staticvoidMain()
{
inta; //不论a的值为多少 TestClass.Testout(out a);均输出3 以函数里面的定义为准(类似方法的返回值 方法只能返回一个out可以多个)
//int a=12
int b = 3// TestClass.Testref(ref b)的结果随b的值改变
TestClass.Testref(ref b);
TestClass.Testout(out a);
Console.ReadKey();
}
}
publicclassTestClass
{
publicstaticvoidTestref(ref inti)
{
i= i + 1;
Console.WriteLine(i);
}
publicstaticvoidTestout(out inti)
{
i= 2;
i= i + 1;
Console.WriteLine(i);
}
}
总结:ref和out这两个关键字的区别是:
1、使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。
2、使用ref和out时,在方法的参数和执行方法时,都要加Ref或Out关键字。以满足匹配。
3、out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。(本来她是30岁,让她输出18岁就可以使用ref 实际的30岁是不会改变的)