• C#中out和ref之间的区别


    之前学习C#时候就遇到了这个问题,不过当时没有深究。昨晚想到这个问题时候自己尝试敲了敲代码,结果从运行的结果来看,越看越乱。在查看了一些资料的基础上,自己总结了一下。
    可能会有点乱,但是自己总结出来的东西。
     
    一:ref 关键字使参数按引用传递。
    其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。
    也即是说,在方法中对参数的设置和改变将会直接影响函数调用之处(代码①及②)。无论是函数的定义还是调用时均不可忽略关键字ref.
    可以对比代码:
    代码①:
     1 class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             Program pg = new Program();
     6             int x = 10;
     7             int y = 20;
     8             pg.GetValue(ref x, ref  y);
     9             Console.WriteLine("x={0},y={1}", x, y);
    10 
    11             Console.ReadLine();
    12           
    13         }
    14 
    15         public void GetValue(ref int x, ref int y)
    16         {
    17             x = 521;
    18             y = 520;
    19         }
    20     }
    运行结果为 

    代码②:

     1 class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             Program pg = new Program();
     6             int x = 10;
     7             int y = 20;
     8             pg.GetValue(ref x, ref  y);
     9             Console.WriteLine("x={0},y={1}", x, y);
    10 
    11             Console.ReadLine();
    12           
    13         }
    14 
    15         public void GetValue(ref int x, ref int y)
    16         {
    17             x = 1000;
    18             y = 1;
    19         }
    20     }

    由代码① 和②的运行结果可以看出,在方法中对参数所做的任何更改都将反映在该变量中,而在main函数中对参数的赋值却没有起到作用,这是不是说明不需要进行初始化呢?来看第二点

    二:ref定义的参数在使用前必须初始化,无论在函数定义时候参数有没有赋予初值。这条正好区分out指定的参数可以不在调用函数的时候进行初始化。
    来看代码③ 以及其运行结果:
     1  class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             Program pg = new Program();
     6             int x;
     7             int y;        //此处x,y没有进行初始化,则编译不通过。
     8             pg.GetValue(ref x, ref  y);
     9             Console.WriteLine("x={0},y={1}", x, y);
    10 
    11             Console.ReadLine();
    12           
    13         }
    14 
    15         public void GetValue(ref int x, ref int y)
    16         {
    17             x = 1000;
    18             y = 1;
    19         }    
    20     }

    出现的错误为:使用了未赋值的局部变量“x”,“y”。故可以说明ref指定的参数无论在函数定义的时候有没有赋予初值,在使用的时候必须初始化。

    三 :对out来说,第一条同样适用。将代码①以及②中的ref全部修改成out,则可与使用ref得到同样的结果。
     
    四:out指定的参数必须在函数定义的时候就赋初值。否则则出现错误。对比ref指定的参数则可以不在函数内部进行赋初值,在函数调用时候再赋初值也可以。
    代码④:
     1 class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             Program pg = new Program();
     6             int x=10;
     7             int y=233;
     8             pg.Swap(out x, out y);
     9             Console.WriteLine("x={0},y={1}", x, y);
    10 
    11             Console.ReadLine();
    12           
    13         }
    14 
    15         public void Swap(out int a,out  int b)
    16         {
    17             
    18             int temp = a;   //a,b在函数内部没有赋初值,则出现错误。
    19             a = b;
    20             b = temp;
    21         }     
    22     
    23     }
    出现错误:使用了未赋值的out参数“a”,"b"
    则在swap函数定义时候给a,b赋上初值则运行正确。
     
    总结以上四条得到ref和out使用时的区别是:
    ①:ref指定的参数在函数调用时候必须初始化,不能为空的引用。而out指定的参数在函数调用时候可以不初始化;
    ②:out指定的参数在进入函数时会清空自己,必须在函数内部赋初值。而ref指定的参数不需要。
    注:本文转载于:http://www.cnblogs.com/yanhan/archive/2013/01/26/2877889.html
  • 相关阅读:
    微信小程序与内嵌webview之间来回跳转的几点总结,以及二维码的使用
    web端生成的带有echarts图表的html页面,嵌入在(javaFx)webview中显示错位问题
    vue项目中引入循环执行setInterval或者requestAnimationFrame的用法等
    css3的calc属性不生效问题
    element-ui使用el-tabs组件的时候浏览器直接卡死的问题
    webkitdirectory 实现文件夹上传
    开发vue插件并发布到npm包管理工具的流程
    路径前加与不加反斜杠 /
    DNS学习笔记
    好用的chrome插件
  • 原文地址:https://www.cnblogs.com/GISQZC/p/5191922.html
Copyright © 2020-2023  润新知