zoukankan      html  css  js  c++  java
  • C#中ref和out的作用和区别

    相同点:方法的定义和调用都必须显示使用ref、out关键字。都会导致参数按引用传递。

    不同点:传递给ref关键字的参数必须赋初始值,而out不用。out关键字会清空变量,即使变量已经赋值也不行,退出函数时所有out引用个变量都要赋值。

     

    说明:ref的应用场景是内部对外部的值进行改变,而out则是内部对外部变量赋值。out一般用在函数有多个返回值。

     

     

    [c-sharp] view plaincopy
    1. using System;  
    2. using System.Collections.Generic;  
    3. using System.Linq;  
    4. using System.Text;  
    5. namespace aaa  
    6. {  
    7.     class Program  
    8.     {  
    9.         static void Main(string[] args)  
    10.         {  
    11.             int age = 22;//传递给ref定义参数的方法,所以必须赋初始值。  
    12.             A a = new A();  
    13.             a.GetStr(ref age);  
    14.             Console.WriteLine(age.ToString());//导致参数按引用传递,所以目标函数变量会直接被更改这个数值。  
    15.             int year;////传递给out定义参数的方法,不需要赋初始值。  
    16.             a.GetTest(out year);  
    17.             Console.WriteLine(year.ToString());//导致参数按引用传递,所以目标函数变量会直接被赋予这个数值。  
    18.             Console.Read();  
    19.         }  
    20.     }  
    21.     public class A  
    22.     {  
    23.         public void GetStr(ref int i)  
    24.         {  
    25.             i = 0;//ref修饰,可以修改也可以不改。  
    26.         }  
    27.         public void GetTest(out int i)  
    28.         {  
    29.             i = 100;//out修饰,必须在退出此方法前为out修饰的变量i赋值。  
    30.         }  
    31.     }  
    32. }  

      

    尽管 ref  out 在运行时的处理方式不同,但在编译时的处理方式相同。因此,如果一个方法采用 ref 参数,而另一个方法采用 out 参数,则无法重载这两个方法。例如,从编译的角度来看,以下代码中的两个方法是完全相同的,因此将不会编译以下代码:

    class CS0663_Example

    {

        // Compiler error CS0663: "cannot define overloaded

        // methods that differ only on ref and out".

        public void SampleMethod(ref int i) { }

        public void SampleMethod(out int i) { }

    }

    但是,如果一个方法采用 ref  out 参数,而另一个方法不采用这两个参数,则可以进行重载,如下例所示:

    class RefOutOverloadExample

    {

        public void SampleMethod(int i) { }

        public void SampleMethod(ref int i) { }

    }

     

    需要指出的是:
    1、当我们频繁传递大型参数的时候,比如说DataTable、DataSet...的时候,会节省好多内存资源。
    2、当我们想得到方法多样化的处理结果的时候,而我们又不愿意复杂化方法所返回的结果,那么我们可以在方法里定义多个ref 或者 out,以期得到丰富的结果。比如说,我们调用一个方法,要同时得到string、int、double、bool、Array...等几种不同类型的结果,而return返回object又很复杂的时候,ref 和out的处理效果,看上去将会是多么的赏心悦目...

     

    此文章出处:

    http://blog.csdn.net/qingyun1029/article/details/5943358

  • 相关阅读:
    实战-百度云[大文件/文件夹]下载限制破解
    IOCP之客户端及消息传递
    IOCP简单实现
    Charles V4系列更新 | 绿色特别版 | 视频教程
    Charles 3.11.5 绿色特别版
    VC运行库合集2005/2008/2010/2012/2013/2015
    手游测试之《弱网测试》
    后端性能测试不可不知的二三事
    linux性能指标及分析工具
    Shell笔记-04
  • 原文地址:https://www.cnblogs.com/c-y-across-I/p/3370662.html
Copyright © 2011-2022 走看看