using System; namespace Lesson { class Program { #region 知识点一 学习ref和out的原因 //他们可以解决 在函数内部改变外部传入的内容 里面变了 外面也要变 #endregion #region 知识点二 ref和out的使用 //函数参数的修饰符 //当传入的值类型参数在内部修改 或引用类型参数在内部重新声明时 //外部的值会发生变化 #endregion #region 知识点三 ref和out的区别 //1.ref传入的变量必须在外部初始化,out不用 //2.out传入的变量必须在内部赋值,ref不用 //1 //int a; //ChangeValueRef(ref a);//报错 //ChangeValueOut(out a);//不报错 //2 // static void ChangeValueOut(out int value) // { // value = 99;//不赋值报错 // } #endregion //ref(在函数类型参数前用ref修饰 static void ChangeValueRef(ref int value) { value = 99; } static void ChangeArrayRef(ref int[] arr) { arr = new int[] { 99, 99, 99 }; } //out(在函数类型参数前用out修饰 static void ChangeValueOut(out int value) { value = 99; } static void ChangeArrayOut(out int[] arr) { arr = new int[] { 99, 99, 99 }; } static void ChangeValue(int value) { value = 99; } static void ChangeArrayValue(int[] arr) { arr[0] = 99;//将arr2的地址传给arr,两个地址指向的地址都一样,再将地址上的值从1改为99 } static void ChangeArrayValue2(int[] arr) { arr = new int[] { 99 };//将arr2的地址传给arr,两个地址指向的地址都一样, //在新开一个arr数组,但此时arr和arr2的联系断了, //arr新开了一个地址来存放99,arr2还是1 } static void Main(string[] args) { Console.WriteLine("尝试直接使用函数修改a的值到99:"); //试图使用函数修改a的值 int a = 1; ChangeValue(a); Console.WriteLine(a);//外部值不变 //在值类型和引用类型中有讲到,这是值类型,新开内存,拷贝值 Console.WriteLine("尝试直接使用函数修改arr2[0]的值到99:"); int[] arr2 = { 1, 2, 3 };//复原 ChangeArrayValue(arr2); Console.WriteLine(arr2[0]);//内外同值99 //在值类型和引用类型中有讲到,这是引用类型,不新开,直接拷贝地址,arr2和函数的arr指向同一地址 Console.WriteLine("尝试直接使用函数修改arr2[0]的值到99:(但在函数中new了一个数组)"); arr2 = new int[] { 1, 2, 3 };//复原 ChangeArrayValue2(arr2); Console.WriteLine(arr2[0]);//外部值不变 //引用类型,但是在函数内新开了内存,arr2和arr指向的不是同一地址,只修改了函数内部arr[0]的值 //如果在函数中new了一个数组,那么怎么保持内外部统一一个值呢 //ref和out就是来解决这个问题的 //用ref来改变值类型的值 Console.WriteLine("使用ref函数修改a的值到99:"); a = 1;//复原 ChangeValueRef(ref a);//需要在传入参数时也加上ref修饰符 Console.WriteLine(a);//内外同值99 //用ref来改变引用类型的值 arr2 = new int[] { 1,2,3 };//复原 Console.WriteLine("使用ref函数修改arr2[]的值到99:(在函数中new了一个数组)"); ChangeArrayRef(ref arr2); Console.WriteLine(arr2[0]);//内外同值99 //用out来改变值类型的值 Console.WriteLine("使用out函数修改a的值到99:"); a = 1;//复原 ChangeValueOut(out a); Console.WriteLine(a); //用out来改变引用类型的值 Console.WriteLine("使用out函数修改arr2[]的值到99:(在函数中new了一个数组)"); arr2 = new int[] { 1, 2, 3}; ChangeArrayOut(out arr2); Console.WriteLine(arr2[0]); } } }