博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 中的 ref 和 out 的意义和使用方法
阅读量:6151 次
发布时间:2019-06-21

本文共 2553 字,大约阅读时间需要 8 分钟。

原文

 

  向方法传递一个实参时,对应的形参会用实参的一个副本来初始化,不管形参是值类型(例如 int),可空类型(int?),还是引用类型,这一点都是成立的。也就是随便在方法内部进行什么修改,都不会影响实参的值。例如,对于引用类型,方法的改变,只是会改变引用的数据,但实参本身并没有变化,它仍然引用同一个对象。

        代码如下:

 

using System;      using System.Collections.Generic;      using System.Linq;      using System.Text;            namespace ref_out      {          class Program          {              static void Main(string[] args)              {                  int i = 8;                  Console.WriteLine(i);                  DoIncrease(i);                  Console.WriteLine(i);              }                    static void DoIncrease(int a)              {                  a++;              }          }      }

 

  运行结果如下:

      若使用 ref 关键字,向形参应用的任何操作都同样应用于实参,因为形参和实参引用的是同一个对象。

  PS:实参和形参都必须附加 ref 关键字做为前缀。

 

using System;      using System.Collections.Generic;      using System.Linq;      using System.Text;            namespace ref_out      {          class Program          {              static void Main(string[] args)              {                  int i = 8;                  Console.WriteLine(i);   // 8                  DoIncrease(ref i);      // 实参前也必须加 ref                  Console.WriteLine(i);   // 9 // ref 关键字使对形参的动作也应用于实参              }                    static void DoIncrease(ref int a)   // 形参前必须加 ref              {                  a++;              }          }      }

 

 运行结果如下

ref 实参使用前也必须初始化,否则不能通过编译。

 

using System;      using System.Collections.Generic;      using System.Linq;      using System.Text;            namespace ref_out      {          class Program          {              static void Main(string[] args)              {                  int i;          // ref 实参没有初始化,所以程序不能通过编译                  Console.WriteLine(i);                  DoIncrease(ref i);                  Console.WriteLine(i);              }                    static void DoIncrease(ref int a)              {                  a++;              }          }      }

 

有时我们希望由方法本身来初始化参数,这时可以使用 out 参数

代码如下:

 

using System;      using System.Collections.Generic;      using System.Linq;      using System.Text;            namespace ref_out      {          class Program          {              static void Main(string[] args)              {                  int i;    // 没有初始化                  //Console.WriteLine(i); // 此处 i 未初始化,编译错误                  DoIncrease(out i);  // 用方法来给实参赋初值                  Console.WriteLine(i);              }                    static void DoIncrease(out int a)              {                  a = 8;  // 在方法中进行初始化                  a++;    // a = 9              }          }      }

 

 

 

转载地址:http://uomya.baihongyu.com/

你可能感兴趣的文章
bzoj 5006(洛谷 4547) [THUWC2017]Bipartite 随机二分图——期望DP
查看>>
CF 888E Maximum Subsequence——折半搜索
查看>>
欧几里德算法(辗转相除法)
查看>>
面试题1-----SVM和LR的异同
查看>>
MFC控件的SubclassDlgItem
查看>>
如何避免历史回退到登录页面
查看>>
《图解HTTP》1~53Page Web网络基础 HTTP协议 HTTP报文内的HTTP信息
查看>>
unix环境高级编程-高级IO(2)
查看>>
树莓派是如何免疫 Meltdown 和 Spectre 漏洞的
查看>>
雅虎瓦片地图切片问题
查看>>
HTML 邮件链接,超链接发邮件
查看>>
HDU 5524:Subtrees
查看>>
手机端userAgent
查看>>
pip安装Mysql-python报错EnvironmentError: mysql_config not found
查看>>
http协议组成(请求状态码)
查看>>
怎样成为一个高手观后感
查看>>
[转]VC预处理指令与宏定义的妙用
查看>>
JQuery radio单选框应用
查看>>
MySql操作
查看>>
python 解析 XML文件
查看>>