ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。例如:

class RefOutOverloadExample
{
    public void SampleMethod(int i) {  }
    public void SampleMethod(ref int i) {  }
}

按引用传递值类型(如本主题前面所示)是有用的,但是 ref 对于传递引用类型也是很有用的。这允许被调用的方法修改该引用所引用的对象,因为引用本身是按引用来传递的。下面的示例显示出当引用类型作为 ref 参数传递时,可以更改对象本身。

class RefRefExample
{
    static void Method(ref string s)
    {
        s = "changed";
    }
    static void Main()
    {
        string str = "original";
        Method(ref str);
        // str is now "changed"
    }
}
参数传递可分值传递,引用传递。 
引用类型都是引用传递,就是对传递进去的变量的修改会反映在原来的变量上, 
值类型 当不用 out或者 ref的时候就是 值传递,就是对传递进去的变量的修改不会反映在原来的变量上,修改的只是原来变量的一个副本。 
加上 out或者 ref可以实现值类型的引用传递

out 关键字会导致参数通过引用来传递。这与 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字。例如:

class CS0663_Example 
{
    // Compiler error CS0663: "Cannot define overloaded 
    // methods that differ only on ref and out".
    public void SampleMethod(out int i) {  }
    public void SampleMethod(ref int i) {  }
}

尽管作为 out 参数传递的变量不必在传递之前进行初始化,但需要调用方法以便在方法返回之前赋值。

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

class CS0663_Example 
{
    // Compiler error CS0663: "Cannot define overloaded 
    // methods that differ only on ref and out".
    public void SampleMethod(out int i) {  }
    public void SampleMethod(ref int i) {  }
}

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

class RefOutOverloadExample
{
    public void SampleMethod(int i) {  }
    public void SampleMethod(out int i) {  }
}

ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。例如:

class RefExample
{
    static void Method(ref int i)
    {
        i = 44;
    }
    static void Main()
    {
        int val = 0;
        Method(ref val);
        // val is now 44
    }
}

传递到 ref 参数的参数必须最先初始化。这与 out 不同,后者的参数在传递之前不需要显式初始化。尽管 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) {  }
}

转载于:https://www.cnblogs.com/dupeng0811/archive/2009/03/11/1408554.html

ref out 关键字用法与区别详解相关推荐

  1. python cut函数_基于python cut和qcut的用法及区别详解

    我就废话不多说了,直接上代码吧: from pandas import Series,DataFrame import pandas as pd import numpy as np from num ...

  2. MySQL中索引与视图的用法与区别详解

    索引与视图是我们在日常使用mysql必不可少的一部分,最近在学习中看到一本书中关于这方法写的不错,所以这篇文章主要给大家介绍了关于MySQL中索引与视图的使用与区别的相关资料,需要的朋友可以参考借鉴, ...

  3. keydown、keypress与keyup用法及区别详解

    定义和用法 - [keydown - 键按下的过程](https://www.runoob.com/jquery/event-keydown.html) 当键盘键被按下时发生 keydown 事件. ...

  4. 【pytorch】model.train和model.eval用法及区别详解

    使用PyTorch进行训练和测试时一定注意要把实例化的model指定train/eval,eval()时,框架会自动把BN和DropOut固定住,不会取平均,而是用训练好的值,不然的话,一旦test的 ...

  5. php 点号 的用法,基于php中echo用逗号和用点号的区别详解

    php 的 基于php中echo用逗号和用点号的区别详解 实例如下: echo 1+5; echo " "; echo '1+5='."1+5"." ...

  6. const int *a和int*const a 的区别详解

    补充知识 "const int i"与"int const i"之间的区别 对变量来说,const 关键字可以限定一个变量的值不允许改变,从而保护被修饰的东西, ...

  7. java之yield(),sleep(),wait()区别详解-备忘笔记

    java之yield(),sleep(),wait()区别详解-备忘笔记 1.sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁.也就是说如 ...

  8. java this关键字的使用_Java this 关键字的使用方法详解

    Java this 关键字的使用方法详解 构造方法中的this关键字 构造方法是一个类的对象在通过new关键字创建时自动调用的,在程序中不能向调用其他方法一样通过方法名(也就是类名)来调用.但如果一个 ...

  9. linux中cat、more、less命令区别详解

    linux中cat.more.less命令区别详解 转自:https://blog.csdn.net/xyw_blog/article/details/16861681 众所周知linux中命令cat ...

  10. 转 常量指针和指针常量的区别详解

    传送门 常量指针和指针常量的区别详解 在C/C++中关键字const用来定义一个只读的变量或者对象,有如下优点     (1)便于类型检查,如函数的函数 fun(const int a) a的值不允许 ...

最新文章

  1. 【ES6】数组的拓展
  2. 数据结构树的基本操作_《数据结构》树的基本操作.doc
  3. outlook2007 未知错误,代码0x80040600解决方法
  4. Android 进程间通信 实例分析
  5. href=javascript 显示开发中_Looking Glass全息显示屏兼容全新虚幻引擎插件
  6. 实例演示如何在spring4.2.2中集成hibernate5.0.2并创建sessionFactory
  7. 魅力 .NET:从 Mono、.NET Core 说起
  8. [web性能优化] - 使用在线工具对html、js、css进行压缩
  9. 海域动态监视监测管理系统_监视和管理备份系统
  10. OpenGL渲染管线,着色器,光栅化等概念理解
  11. (软件工程复习核心重点)第四章总体设计-第三节:启发规则
  12. 轻松云上揽胜中华,靠的就是这份聪明的“地图”!
  13. 拓端tecdat|R语言估计获胜概率:模拟分析学生多项选择考试通过概率可视化
  14. AD10操作技巧及参数
  15. Android 画三角形shape
  16. 一种兼顾速度和效果的对比度增强算法——CONTRAST ENHANCEMENT BASED ON LAYERED DIFFERENCE REPRESENTATION
  17. 怎么查看电脑开关机时间记录
  18. 杜比介绍 杜比数位 Dolby
  19. JavaScript 汉字转拼音
  20. 圣思园——Java SE Lesson 11

热门文章

  1. 综述:关系抽取,挑战与机遇并存!
  2. 通俗易懂理解Attention机制
  3. 每日算法系列【LeetCode 875】爱吃香蕉的珂珂
  4. LeetCode刷题——343. 整数拆分
  5. 超轻量级PHP框架BroPHP
  6. 共迎海量数据库管理挑战 中韩数据库专家对话北京
  7. 文件管理器之字符和编码
  8. 面试题 17.09. 第 k 个数
  9. java快排原理_快速排序 java实现 (原理-优化) 三路快排
  10. Vue项目部署到服务器上路由无法访问的问题