1、ref:

ref:MSDN的定义为:“The ref keyword indicates a value that is passed by reference.”就是通过引用来传递参数。ref也是Reference的缩写。了解了定义之后,ref怎么用呢?首先我们要明白值类型和引用类型的概念,这里的ref基本上就是服务于值类型的。

ref 的使用


//不使用 ref;
void Method(int myRefInt)
{myRefInt += 66;
}int number = 1;
Method(number);
Console.WriteLine(number);
//输出 : 1//使用ref
void Method(ref int myRefInt)
{myRefInt += 66;
}int number = 1;
Method(ref number);
Console.WriteLine(number);//输出:67

看到这里想必已经明白了:

不使用ref的时候,函数收到的值是1,然后在Method(int myRefInt)方法中,局部变量myRefInt做了累加之后,在方法执行完成之后就已经销毁了。number的值还是1。
           使用ref的时候,函数Method(ref int myRefInt)值收到的是number的地址,函数中执行的myRefInt+=66;此时相当于number+=66;直接修改了number地址的值。
           那就可以等处结论了:ref是通过给方法传递值类型的参数,直接操作同一个变量的关键字。

2、out

out的定义:来自MSDN:As a parameter modifier, which lets you pass an argument to a method by reference rather than by value./“out”作为一个参数修饰符,允许您通过引用而不是通过值将参数传递给方法。
            In generic type parameter declarations for interfaces and delegates, which specifies that a type parameter is covariant./在接口和委托的泛型类型参数声明中,它指定类型参数是协变的。今天的语境下,我们只讨论第一种作为引用传递参数的定义。

out的用法

int number;Method(number);void Method(int myRefInt)
{myRefInt = 66;
}Console.WriteLine(number);
//输出:0int number;Method(out number);void Method(out int myRefInt)
{myRefInt = 66;
}Console.WriteLine(number);
//输出:66

从上述out用法的表现来看,out和ref其实都可以允许通过引用来传递参数。那么问题来了既然ref 、out的作用看起来一样,为什么还定义了两个关键字呢?

ref和out的区别:

当你在使用ref传递参数的时候,ref修饰的参数必须要有值,但是out可以使用一个未赋值的变量作为参数传递。下面我也用代码做了验证。

 class RefAndOut{public static void OutDouble(out int outInt){outInt = 2;Console.WriteLine("outInt is:"+outInt);}public static void RefDouble(ref int parInt){parInt *= 2;Console.WriteLine("refInt is:"+parInt);Console.ReadKey();}public static void NormalDouble(int IntPar){IntPar = 1;IntPar *= 2;Console.WriteLine("normalInt is:" + IntPar);Console.ReadKey();}static void Main(string[] args){int refInt;int outInt;int normalInt;OutDouble(out outInt);RefDouble(ref refInt);//错误:使用了未赋值的变量refIntNormalDouble(normalInt);//错误:使用了未赋值的变量normalInt}}

这段代码在两处地方有错误:即在使用ref,和不使用修饰符的时候,必须要传递一个有值的参数。所以你看,ref和out几乎就只有一个区别,那就是out可以使用未赋值的变量。

C#中关键字ref和out相关推荐

  1. C#中关键字ref与out的区别(转)

    C#中关键字ref与out的区别(转) 在C#中,ref与out是很特殊的两个关键字.使用它们,可以使参数按照引用来传递. 总的来说,通常我们向方法中传递的是值.方法获得的是这些值的一个拷贝,然后使用 ...

  2. 使用C#中的ref关键字,用2个简单例子来说明

    在C#中,如果在方法参数前面加上ref关键字,说明参数传递的是引用,而不是值.如何理解呢? 参数是简单类型的例子 static void Main(string[] args){string temp ...

  3. c#中使用ref和out传值

    c#中使用ref和out传值 首先,如果不使用这两个关键字,那是什么样 呢? 看下面的例子: 使用ref: using System; class Test { static void Swap(re ...

  4. c#ref和out的相同点_C#中使用ref和out一点认识!

    ref 通常我们向方法中传递的是值.方法获得的是这些值的一个拷贝,然后使用这些拷贝,当方法运行完毕后,这些拷贝将被丢弃,而原来的值不将受到影响.此外我们还有其他向方法传递参数的形式,引用(ref)和输 ...

  5. 【C# 教程系列第 4 篇】什么是 c# 中的 ref 参数?

    这是[C# 教程系列第 4 篇],如果觉得有用的话,欢迎关注专栏. 写这篇博客之前,本来想把标题写成 "ref参数与out参数的区别",但想了想还是分开写吧,以免更混淆大家. 首先 ...

  6. C++中关键字的理解--Static

    C++中关键字的理解---Static    目录:1.static缘起             2.static自我理解             3.static举例使用             4 ...

  7. c# 中关键字_C#中的“使用”关键字

    c# 中关键字 Prerequisite: Namespace in C# 先决条件: C#中的命名空间 If you want to include namespace in a program t ...

  8. Vue3 Composition API(二)——computed、watchEffect、setup中使用ref

    一.computed 在前面我们讲解过计算属性computed:当我们的某些属性是依赖其他状态时,我们可以使用计算属性来处理 在前面的Options API中,我们是使用computed选项来完成的: ...

  9. mysql关键字使用顺序_MySQL数据库之单表查询中关键字的执行顺序

    MySQL数据库之单表查询中关键字的执行顺序 1 语法顺序 select distinct from where group by having order by limit 2 执行顺序 from ...

最新文章

  1. Linux下su与su -命令的区别
  2. Android技术点增长 - 收藏集 - 掘金
  3. java技术_JAVA-JDBC技术
  4. Dart_VM的相关简介与运行模式解析
  5. Web服务-Nginx网页服务
  6. UIView类绘图出现错误提示
  7. Netty入门(二)时间服务器及客户端
  8. Oracle 数据库的基本用法
  9. datatables表格行内编辑的实现
  10. ET工业大脑将大规模落地江苏 继续发挥“中国智造1%威力”
  11. 2021年还能用的13款完全免费的Office插件整理(含功能详细介绍)
  12. 计算机显示发送报告,Word文档打不开提示发送错误报告的解决方法
  13. AT89S52单片机之硬件存储结构
  14. mac倾倒废纸篓提示文件正在使用中的一种解决办法
  15. WPF StatusBar控件
  16. QObject::moveToThread: Current thread(...) is not the object`s thread. Cannot move to target thread(
  17. 无法获取链接服务器 XXX 的 OLE DB 访问接口 SQLNCLI10 的架构行集 DBSCHEMA_TABLES_INFO。该访问接口支持该接口,但使用该接口时返回了失败代码。...
  18. APP上架到各大应用商店指南
  19. 艰难2020:人工智能的应用是否已停滞不前?
  20. WITH AS 用法 (说实话,WITH AS还真是简单)

热门文章

  1. 贝塞尔曲线与CAShapeLayer的关系以及Stroke动画
  2. python安装easy_install和pip
  3. .NET 缩略图服务器 ResizingServer
  4. Sql Server系列:触发器
  5. 公司Windows Office升级项目总结
  6. ImportError: No module named pil
  7. nginx 0.8.x + PHP 5.2.13 胜过apache十倍的web服务器
  8. 深入研究asp.net2.0——控件类库
  9. vista 文件夹提升权限
  10. virtual box卸载后无法正常安装