C# ref and out的使用小结

 更新时间:2021年03月08日 08:45:56   作者:LeeMacrofeng  
这篇文章主要介绍了C# ref and out的使用小结,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下

相同点:

  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;
    }

  }
}

输出结果为:

注意点:

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 参数,而另一个方法不采用这两个参数,则可以进行重载。

以上就是C# ref and out的使用小结的详细内容,更多关于C# ref and out的使用的资料请关注脚本之家其它相关文章!

相关文章

  • C# 爬虫简单教程

    C# 爬虫简单教程

    这篇文章主要介绍了C# 爬虫的简单教程,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2020-12-12
  • C#中事务处理和非事务处理方法实例分析

    C#中事务处理和非事务处理方法实例分析

    这篇文章主要介绍了C#中事务处理和非事务处理方法,较为详细的分析了C#中事务处理与非事务处理的使用技巧,对于使用C#进行数据库程序开发有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • 共享锁using范围的实现方法

    共享锁using范围的实现方法

    共享锁using范围的实现方法,需要的朋友可以参考一下
    2013-04-04
  • 浅谈C#数组(一)

    浅谈C#数组(一)

    本篇文章小编要得大家介绍的是C#数组,数组是一种数据结构,它可以包含同一个类型的多个元素,如果需要使用同一类型的多个对象,可以使用数组和集合,需要的朋友可以参考下面文章的具体内容
    2021-09-09
  • 深入理解C#中的枚举

    深入理解C#中的枚举

    本篇文章主要是对C#中的枚举进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-01-01
  • C#和Java有什么区别和联系

    C#和Java有什么区别和联系

    这篇文章主要介绍了C#和Java有什么区别和联系的相关资料,本文介绍的非常详细,涉及到rsa语法,c#和java互转方面的知识点,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-07-07
  • C# ConfigHelper 辅助类介绍

    C# ConfigHelper 辅助类介绍

    ConfigHelper(包含AppConfig和WebConfig), app.config和web.config的[appSettings]和[connectionStrings]节点进行新增、修改、删除和读取相关的操作。
    2013-04-04
  • C#中实现查找字符串中指定字符位置方法小结

    C#中实现查找字符串中指定字符位置方法小结

    这篇文章主要为大家介绍了C#中实现查找字符串中指定字符位置的常用方法,本文将以"."字符为例,详细讲解这些方法的具体使用,需要的可以参考下
    2024-02-02
  • Unity Shader实现水波纹效果

    Unity Shader实现水波纹效果

    这篇文章主要为大家详细介绍了Unity Shader实现水波纹效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • C#中生成DLL及其事件的处理

    C#中生成DLL及其事件的处理

    在C#中,创建动态链接库是一个常见的任务,本文主要介绍了C#中生成DLL及其事件的处理,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2024-01-01

最新评论