欢迎访问 生活随笔!

尊龙游戏旗舰厅官网

当前位置: 尊龙游戏旗舰厅官网 > 编程语言 > c# >内容正文

c#

c#之out和ref区别 -尊龙游戏旗舰厅官网

发布时间:2023/11/29 c# 17 豆豆
尊龙游戏旗舰厅官网 收集整理的这篇文章主要介绍了 c#之out和ref区别 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

out与ref的区别总结:
1.两者都是通过引用来传递。
2.两者都按地址传递的,使用后都将改变原来参数的数值。
3.属性不是变量,因此不能作为 out或ref 参数传递。
4.若要使用 ref 或 out,方法定义和调用方法都必须显式使用 out、ref 关键字。
5.rel可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。或者说,rel是有进有出,out是只出不进
6.尽管 ref 和 out 在运行时的处理方式不同,但在编译时的处理方式相同。
—6-1.因此,如果一个方法采用 ref 参数(例:method(ref int i)),而另一个方法采用 out 参数(例:method(out int i)),则无法重载这两个方法,因为从编译的角度来看,以上两个方法是完全相同的,因此将不会编译方法内的代码
—6-2.但是,如果一个方法采用 ref 或 out 参数(例如:method(ref/out int i))),而另一个方法不采用这两个参数method(int i)),则可以进行重载
7.实用场合:out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。

代码如下:

1 public static void main(string[] args) 2 { 3 //使用out 4 console.writeline("-----------------------------使用out的方法-----------------------------"); 5 console.writeline("-----------------调用out方法前参数没赋值-----------------"); 6 string outname; 7 string outschool; 8 int outgrad; 9 outmethod(out outname, out outgrad, out outschool); 10 console.writeline("学生" outname "是:" outschool outgrad "级学生"); 11 12 console.writeline("-----------------调用out方法前参数赋值了-----------------"); 13 string outnamevalue = "李xx"; 14 string outschoolvalue = "河南大学"; 15 int outgradvalue = 2011; 16 outmethod(out outnamevalue, out outgradvalue, out outschoolvalue); 17 console.writeline("学生" outnamevalue "是:" outschoolvalue outgradvalue "级学生"); 18 19 20 21 //使用ref: 22 console.writeline("-----------------------------使用ref的方法-----------------------------"); 23 string refname = "李xx"; 24 string refschool = "河南大学"; 25 int refgrad = 2011; 26 console.writeline("-----------------refmethod方法里没赋值-----------------"); 27 refmethod(ref refname, ref refgrad, ref refschool); 28 console.writeline("学生" refname "是:" refschool refgrad "级学生"); 29 console.writeline("-----------------refmethod方法里赋值了-----------------"); 30 refmethodvalue(ref refname, ref refgrad, ref refschool); 31 console.writeline("学生" refname "是:" refschool refgrad "级学生"); 32 33 console.readline(); 34 } 35 36 37 38 //outmethod 39 //out方法输出参数特征: 40 //1.不在栈中为形参分配新的内存。 41 //2.形参的名称相当于实参变量的别名,引用与实参相同的内存位置。 42 //3.既然形参和实参引用相同的内存位置,则在方法执行期间,形参所做的任何改变在方法完成之后通过实参变量都是可见的。 43 private static void outmethod(out string name, out int grad, out string school) 44 { 45 name = "王xx"; 46 grad = 2009; 47 school = "郑州大学"; 48 } 49 50 //refmethod 51 //ref方法输出参数特征: 52 //1.不在栈中为形参分配新的内存。 53 //2.形参的名称相当于实参变量的别名,引用与实参相同的内存位置。 54 //3.既然形参和实参引用相同的内存位置,则在方法执行期间,形参所做的任何改变在方法完成之后通过实参变量都是可见的。 55 private static void refmethod(ref string name, ref int grad, ref string school) 56 { 57 58 } 59 private static void refmethodvalue(ref string name, ref int grad, ref string school) 60 { 61 name = "王xx"; 62 grad = 2009; 63 school = "郑州大学"; 64 }

 以上代码的输出结果:

由以上的输出结果可以看出:

1、在调用方法outmethod之前变量赋值不赋值没有任何意义,因为out是要把参数清空的,其参数赋值只要在方法内部进行就可以了;即out是只出不进

2、在调用refmethod之前必须给变量赋值,然而在refmethod方法内部参数赋值不赋值均可以,如方法内部重新赋值了则修改其值,如方法内部没重新赋值则不修改其值;rel是有进有出,

转载于:https://www.cnblogs.com/cocoon/p/4997010.html

总结

以上是尊龙游戏旗舰厅官网为你收集整理的c#之out和ref区别的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得尊龙游戏旗舰厅官网网站内容还不错,欢迎将尊龙游戏旗舰厅官网推荐给好友。

  • 上一篇:
  • 下一篇:
网站地图