引用参数:ref XXX
1、用ref参数的变量必须有:
- 在函数调用中用“非常量”(即非const变量),因为可能会改变引用参数的值
- 必须用初始化后的变量
2、ref关键字用于函数参数时与引用类型的区别
ref使用关键字时可以使原来的引用变量指向了另一个对象 ,即在用 ref时可以改变原引用变量的指向。
网上一帖子的回复示例比较简洁,拿来记录举例:
(1)不加ref的引用
public class a
{
public int val;
}
public class test
{
public static void Main()
{
a a1=new a();
changeIt(a1);
Console.WriteLine(a1.val.ToString());
Thread.Sleep(10000);
}
public static void changeIt(a objects)
{
objects.val = 200;
}
}
不加ref的引用类型必须指向同一对象,结果才为200。
(2)加ref的引用类型
public class a
{
public int val;
}
public class test
{
public static void Main()
{
a a1=new a();
changeIt(ref a1);
Console.WriteLine(a1.val.ToString());
Thread.Sleep(10000);
}
public static void changeIt(ref a objects)
{
a obj = new a();
obj.val = 200;
objects = obj;
}
}
ref的引用类型可以改变原引用变量的指向,以上结果为200。若是不加ref的引用类型,以上函数的结果为0。
3、ref关键字可用于函数参数,也可用于局部变量和返回值
(1)局部变量:
int animalNum = 66;
ref int duckNum = ref animalNum;
duckNum = 50;
结果为animalNum和duckNum均为50。
(2)返回值
static ref int GetAnimalNum(ref int animalNum)
{
animalNum *=2;
return ref animalNum;
}
注意:strings是引用类型,但属于特例,因为它们是不可改变的,修改它们会产生新的string ,原有的string则会被解除分配,如果试图通过ref返回string,则C#编辑器Roslyn会报错。(这段话摘自《C#入门经典(第8版)》)
输出参数:out XXX
未初始化的变量可以用作out参数,但不可用于ref参数;
在函数使用out参数时,必须把它看成尚未赋值。