如何设计网站的链接,肯德基网站建设,WordPress地址栏,菏泽市建设局网站C#值传递和引用传递
1.值传递和引用传递
值传递#xff1a;值传递时#xff0c;系统首先为被调用方法的形参分配内存空间#xff0c;并将实参的值按位置一一对应复制给形参#xff0c;被调用方法中形参得任何改变都不会影响到相应的实参。 引用传递时#xff1a;系统不是…C#值传递和引用传递
1.值传递和引用传递
值传递值传递时系统首先为被调用方法的形参分配内存空间并将实参的值按位置一一对应复制给形参被调用方法中形参得任何改变都不会影响到相应的实参。 引用传递时系统不是将实参本身得值赋值后传给形参而是将其引用值地址值传递给形参。因此形参所引用得该地址上的变量与传递的实参相同方法体内相应的形参值得任何改变都会影响到作为引用传递的实参。
Console.WriteLine(#####################下面是值传递和引用传递的测试代码#####################);Console.WriteLine();//值传递int Age1 18;Console.WriteLine($值参数传递前Age1的值{Age1});//调用方法AgeAdd(Age1);Console.WriteLine($值参数传递后Age1的值{Age1});Console.WriteLine();//引用传递Student stu new Student();stu.Age 28;Console.WriteLine($引用参数传递前Age1的值{stu.Age});//调用方法AgeAdd(stu);Console.WriteLine($引用参数传递前Age1的值{stu.Age});Console.ReadKey();//使用的方法public static void AgeAdd(int age){age 10;Console.WriteLine(值传递方法中参数的值 Age : age);}public static void AgeAdd(Student stu){stu.Age 10;Console.WriteLine(引用传递方法中参数的值 Age : stu.Age);}
运行结果
2.ref与out实现值类型的引用传递
1ref指定的参数在函数调用时必须先初始化必须在执行方法之前给ref修饰的参数赋值out不用。 2out指定的参数在进入函数时会清空自己因此必须在函数内部进行初始化操作必须在方法体内给out修饰的变量赋值后才能使用而ref不用。 3ref可以将值传到方法内也可以将值传到方法外 4out只能将值传到方法外 5string是特殊的引用类型操作与值类型看齐需要单独的加上ref和out
注1.可以通过ref和out来决定值类型变量是否按照引用传递 2.声明方法时形参需要带ref和out关键字调用方法时传入的实参也需要带ref和out关键字 Console.WriteLine(#####下面是ref和out的测试代码#####);//ref——num1必须在方法调用前初始化int num 5;Console.WriteLine($执行带ref参数的方法前num的值{num});RefDoubleValue(ref num);Console.WriteLine($执行带ref参数的方法后num的值{num});Console.WriteLine($--------------分割线-----------------);//out——num2无须在方法调用前初始化int num2 10;//为了对比所有初始化num2的值Console.WriteLine($执行带out参数的方法前num的值{num2});//调用方法OutDoubleValue(out num2);Console.WriteLine($执行带out参数的方法后num的值{num2});Console.ReadKey();//相关方法 //带ref参数的方法public static void RefDoubleValue(ref int num){num num * 2;}//带out参数的方法public static void OutDoubleValue(out int num){//方法内部使用前必须初始化num 9;num num * 2;}运行结果
3.装箱和拆箱
1装箱把值类型装换成引用类型 2拆箱把引用类型装换成值类型 3装箱时是不需要显式的类型转换的不过拆箱需要显示的类型转换。
装箱具体发生了什么对象类型在堆中分配一个对象实例并将值类型的实例复制到新对象中。 第一步:新分配托管堆内存大小为值类型实例大小加上一个方法表指针 第二步将值类型的实例也就是值数据拷贝到新分配的内存中 第三步返回托管堆中新分配对象的地址这个地址就是一个指向对象的引用。
拆箱具体发生了什么检查对象实例确保它是给定值类型的一个装箱值然后再将该值从对象实例复制到值类型变量中。 Console.WriteLine(#####下面是装箱和拆箱的测试代码#####);//定义一个整型变量int num 5;//将整型转换为对象类型隐式——装箱Object obj num;Console.WriteLine($将整型变量num装箱后obj变量的值{obj});Console.WriteLine($--------------分割线-----------------);//将对象类型转换为整型显式——拆箱int num2 (int)obj;Console.WriteLine($将引用变量obj拆箱后num变量的值{num2});Console.ReadKey();运行结果 频繁的装箱拆箱比较浪费系统资源。