• 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是有进有出,

  • 相关阅读:
    SpringCloud使用注解+AOP+MQ来实现日志管理模块
    拦截器、过滤器、AOP的区别和联系
    Java对象为啥要实现Serializable接口?
    深入Quartz,优雅地管理你的定时任务
    Filter、FilterChain、FilterConfig 介绍
    过滤器 和 拦截器 的6个区别,别再傻傻分不清了
    SpringAOP + 注解实现日志管理
    Java序列化为什么必须实现 Serializable 接口???
    关于Java序列化的问题你真的会吗
    计算吻合率
  • 原文地址:https://www.cnblogs.com/cocoon/p/4997010.html
Copyright © 2020-2023  润新知