144 lines
4.4 KiB
C#
144 lines
4.4 KiB
C#
|
|
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]);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|