C# ref和out关键字

1.ref 和 out关键字

      谁使用:

        ref关键字值类型变量才需要使用。out关键字值类型和引用类型变量(多个返回值情况下)都可以使用。

       

      ref关键字:

      在方法签名和方法调用中,通过引用将参数传递给方法。 

      怎么理解这句话呢?我们先来看个例子

 static void Main(string[] args)
 {
     int a = 1;//int属于值类型,而对值类型变量的操作只影响存储在变量中的值类型实例
     Test(a);                                              //↑只影响局部变量//
     Console.WriteLine(a);
     Console.ReadLine();
 }
 static void Test(int _a)//这意味着我们这里的参数_a是我们对int类型数据a的一份拷贝
 {
     _a += 1;
 }

      我们运行这段代码,得到的输出结果是a=1。如果我们是想得到a=2这个结果,却错误的使用了上面的代码该如何修正呢?

static void Main(string[] args)
{
    int a = 1;
    Test(ref a);//使用ref关键字 使得我们传入的是a的引用(a的地址)
    Console.WriteLine(a);
    Console.ReadLine();
}
static void Test(ref int a)//这样我们就能改变a本身
{
    a += 1;
}

      我们成功的得到了我们想要的a=2这个结果。

      我们还要明晰另一些知识,那就是在C#中数据类型分为值类型和引用类型,当我们将一个值类型变量当作参数传入一个方法(我们上面的例子),同时我们想要的是修改这个参数本身时,我们就需要使用ref关键字了。

      好,那我们知道了ref关键字的重点就是取被修饰的值类型变量的引用(地址),我们需要注意的是对于被ref关键字修饰的值类型变量必须拥有初始值!必须要赋予初始值。  

    out关键字:

    作为一个参数修饰符,允许您通过引用而不是通过值将参数传递给方法。从定义上来看ref和out关键字都是通过引用将参数传递给方法,那为什么需要两个关键字呢?

    与ref关键字的不同在于,out关键字可以在不赋值的情况下进行参数的传递。

      static void Main(string[] args)
      {
          int a;
          Test(out a);
          Console.WriteLine(a);
          Console.ReadLine();
      }
      static void Test(out int a)
      {
          a = 1;
      }

  我们运行代码得到的结果就为a=1。这是因为Test方法直接通过我们传入的a的引用修改了变量a本身。  

  我们使用out关键字时无需在方法的外部对变量赋值。

 即使赋值,也会在方法中被覆盖

区别:

  ref有进有出,out只出不进。

  ref 关键字使参数按引用传递(给)。out 关键字会导致参数通过引用来传递(拿)。

如有错漏,恳请指出!谢谢!

相关推荐

  1. C#关键字refout

    2024-02-13 09:30:01       59 阅读
  2. C#中的`out`关键字

    2024-02-13 09:30:01       46 阅读
  3. C#学习笔记_关键字ref、out

    2024-02-13 09:30:01       54 阅读
  4. c#面试基础语法——ref、out、using关键字

    2024-02-13 09:30:01       57 阅读
  5. c# 的ref out

    2024-02-13 09:30:01       43 阅读
  6. c# refout参数修饰符

    2024-02-13 09:30:01       59 阅读
  7. Qt宏关键字

    2024-02-13 09:30:01       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-13 09:30:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-13 09:30:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-02-13 09:30:01       82 阅读
  4. Python语言-面向对象

    2024-02-13 09:30:01       91 阅读

热门阅读

  1. 记录 | C++ cout.setf(ios::fixed)

    2024-02-13 09:30:01       53 阅读
  2. k8s搭建容器云平台

    2024-02-13 09:30:01       49 阅读
  3. sqlserver 触发器

    2024-02-13 09:30:01       53 阅读
  4. Tokitsukaze and Short Path (plus)-牛客寒假训练营(二)

    2024-02-13 09:30:01       60 阅读
  5. 使用Nacos实现服务发现

    2024-02-13 09:30:01       53 阅读
  6. git入门

    2024-02-13 09:30:01       48 阅读
  7. 347. 前 K 个高频元素

    2024-02-13 09:30:01       56 阅读
  8. vue3 封装一个通用echarts组件

    2024-02-13 09:30:01       63 阅读
  9. 速盾:cdn集群防御空间dns服务器

    2024-02-13 09:30:01       47 阅读
  10. 深入了解Redis的过期策略和内存淘汰机制

    2024-02-13 09:30:01       44 阅读
  11. AutoSAR(基础入门篇)8.5-C/S原理进阶

    2024-02-13 09:30:01       42 阅读
  12. leetcode 153

    2024-02-13 09:30:01       50 阅读