C# ref and out的使用小结

作者:LeeMacrofeng 时间:2021-12-19 22:35:40 

相同点:

1. ref 和 out 都是按地址传递的,使用后都将改变原来参数的数值;

2. 方法定义和调用方法都必须显式使用 ref 或者 out关键字;

3. 通过ref 和 ref 特性,一定程度上解决了C#中的函数只能有一个返回值的问题。

不同点:

传递到 ref 参数的参数必须初始化,否则程序会报错。


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
 class Program
 {
   static void Main(string[] args)
   {
     int a = 1;
     int b = 2;
     Fun(ref a,ref b);
     Console.WriteLine("a:{0},b:{1}", a, b);//输出:3和4说明传入Fun方法是a和b的引用
   }
   static void Fun(ref int a, ref int b) {
     a = 3;
     b = 4;
   }
 }
}

out关键字无法将参数值传递到out参数所在的方法中, out参数的参数值初始化必须在其方法内进行,否则程序会报错。


using System.Text;

namespace ConsoleApp1
{
 class Program
 {
   static void Main(string[] args)
   {
     int a = 100;
     int b;
     Fun(out a, out b);
     Console.WriteLine("a:{0},b:{1}", a, b);
   }

static void Fun(out int a, out int b)
   {
     //a = 1+2;
     if (a == 100)
       a = 2;

b = 1;
   }

}
}

代码里报错 “Use of unassigned out parameter 'a' ”  

下面的代码是正确的。


using System;

namespace ConsoleApp1
{
 class Program
 {
   static void Main(string[] args)
   {
     int a = 100;
     int b;
     Fun(out a, out b);
     Console.WriteLine("a:{0},b:{1}", a, b);
   }

static void Fun(out int a, out int b)
   {
     a = 1+2;

b = 1;
   }

}
}

输出结果为:

C# ref and out的使用小结

注意点:


using System;

namespace ConsoleApplication1
{
 class Program
 {
   public void SampleMethod(ref int i) { }
   public void SampleMethod(out int i) { }

}
}

上面代码会报错“ 'Program' cannot define an overloaded method that differs only on parameter modifiers 'out' and 'ref'  ”

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


using System;

namespace ConsoleApplication1
{
 class Program
 {
   public void SampleMethod(int i) { }
   public void SampleMethod(ref int i) { }
 }
}

上面代码会报错“ 'Program' cannot define an overloaded method that differs only on parameter modifiers 'out' and 'ref'  ”

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


using System;

namespace ConsoleApplication1
{
 class Program
 {
   public void SampleMethod(int i) { }
   public void SampleMethod(ref int i) { }
 }
}

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

来源:https://www.cnblogs.com/LeeMacrofeng/p/14469359.html

标签:C#,ref,out
0
投稿

猜你喜欢

  • Spring启动时实现初始化有哪些方式?

    2023-09-20 18:25:57
  • 200行java代码实现2048小游戏

    2023-11-29 12:03:57
  • springMVC实现前台带进度条文件上传的示例代码

    2021-09-15 17:24:44
  • 实例讲解Java的Spring框架中的控制反转和依赖注入

    2023-04-24 17:44:49
  • C# listview 点击列头排序的实例

    2023-11-26 20:09:05
  • 深入讲解SPI 在 Spring 中的应用

    2022-10-21 03:44:55
  • 相对路径和绝对路径的写法总结

    2022-06-17 07:38:47
  • SpringBoot整合TKMyBatis实现单表增删改查操作

    2022-01-30 19:52:28
  • Spring BeanDefinition使用介绍

    2023-11-24 10:29:10
  • Java值传递之swap()方法不能交换的解决

    2023-11-12 20:54:50
  • Java进程cpu占用过高问题解决

    2021-08-09 00:16:59
  • java反射拼接方法名动态执行方法实例

    2022-12-07 00:44:28
  • springboot使用校验框架validation校验的示例

    2021-06-10 18:20:25
  • C#二维码图片识别代码

    2022-01-15 13:03:51
  • C#中的并发集合Concurrent类

    2021-10-27 03:44:36
  • IDEA+JRebel实现全自动热部署的方法步骤

    2023-11-29 13:53:30
  • 如何从Java接口的角度切入静态工厂模式

    2021-11-13 16:40:01
  • Spring整合MyBatis图示过程解析

    2023-11-13 11:45:09
  • Java中死锁与活锁的具体实现

    2023-10-29 01:48:02
  • 使用AOP拦截Controller获取@PathVariable注解传入的参数

    2023-04-30 21:42:09
  • asp之家 软件编程 m.aspxhome.com