C#中的ref关键字

简介: C#中的ref关键字

值参数(Value Parameters)

1、传递的是参数的值(数据的副本)而不是原始数据本身。

2、函数内部对值参数的修改不会影响到原始数据。

3、通常用于传递基本数据类型(如整数、浮点数、布尔值)或不可变对象(如字符串、元组)。

4、值参数的传递是一种传值调用(Call by Value)。

示例代码

internal class Program
    {
        static void ShowDouble(int val)
        {
            val *= 2;
            Console.WriteLine($"ShowDouble函数中val的值为:{val}");
        }
        static void Main(string[] args)
        {
            int val = 6;
            Console.WriteLine($"Main函数中执行ShowDouble函数前val的值为:{val}");
            ShowDouble(val);
            Console.WriteLine($"Main函数中执行ShowDouble函数后val的值为:{val}");
        }
    }


运行结果,如下图所示:

把val作为一个参数,调用ShowDouble()并不影响Main()中val的值

那么如何改变val的值呢?

可以使用一个含返回值的函数

代码如下所示:

internal class Program
    {
        static int ShowDouble(int val)
        {
            val *= 2;
            Console.WriteLine($"ShowDouble函数中val的值为:{val}");
            return val;
        }
        static void Main(string[] args)
        {
            int val = 6;
            Console.WriteLine($"Main函数中执行ShowDouble函数前val的值为:{val}");
            val = ShowDouble(val);
            Console.WriteLine($"Main函数中执行ShowDouble函数后val的值为:{val}");
        }
    }


运行结果,如下所示:

成功改变了参数的值,但是这种方式并不直观,且不能改变用作参数的多个变量的值(因为函数只有一个返回值),这时就可以通过引用来传递参数。

引用参数(Reference Parameters)

1、传递的是参数的引用(内存地址),直接操作原始数据。

2、函数内部对引用参数的修改会影响到原始数据。

3、通常用于传递可变对象(如列表、字典)或对象实例,以便在函数内部进行修改并在函数外部保持修改后的状态。

4、引用参数的传递是一种传址调用(Call by Reference)。

C#中使用ref关键字指定参数,代码如下所示:

internal class Program
    {
        static void ShowDouble(ref int val)
        {
            val *= 2;
            Console.WriteLine($"ShowDouble函数中val的值为:{val}");        
        }
        static void Main(string[] args)
        {
            int val = 6;
            Console.WriteLine($"Main函数中执行ShowDouble函数前val的值为:{val}");
            ShowDouble(ref val);
            Console.WriteLine($"Main函数中执行ShowDouble函数后val的值为:{val}");
        }
    }

 

运行结果,如下图所示:

要注意,不仅在函数的声明中要使用ref指定参数,如代码 static void ShowDouble(ref int val)所示,在函数的调用中,也要再次指定它,如代码 ShowDouble(ref val)所示。

使用ref的限制

1、函数可能会改变引用参数的值,所以必须在函数调用中要使用“非常量”变量

const int val = 6;


这种写法,编译器会报错,如下图所示:

2、必须使用初始化过的变量。C#不允许假定ref参数在使用它的函数中初始化。

int val;
  ShowDouble(ref val);

这种写法,编译器也会报错,如下图所示:

参考书籍

《C#入门经典(第7版)》——Benjamin Perkins、Jacob Vibe Hammer、Jon D. Reid

目录
相关文章
|
7月前
|
C#
30.C# 关键字 this初步学习
30.C# 关键字 this初步学习
43 1
|
7月前
|
C#
C#系列之ref和out的区别
C#系列之ref和out的区别
252 0
|
7月前
|
C#
28.c#关键字base初步学习
28.c#关键字base初步学习
40 0
|
7月前
|
C#
27.c#关键字sealed修饰类
27.c#关键字sealed修饰类
73 0
|
7月前
|
开发框架 .NET 编译器
C# 9.0中的静态匿名函数:引入static关键字的新用法
【1月更文挑战第15天】C# 9.0为匿名函数带来了一个新的修饰符static,允许开发者明确指定匿名函数不会捕获其包含作用域中的任何变量。这一特性增强了代码的性能和可读性,同时减少了因不小心捕获变量而导致的潜在错误。本文将详细探讨C# 9.0中静态匿名函数的语法、使用场景以及它们如何影响代码的性能和安全性。
|
7月前
|
SQL 开发框架 .NET
EntityFramework数据持久化复习资料3、C#拓展方法与yield关键字使用
EntityFramework数据持久化复习资料3、C#拓展方法与yield关键字使用
58 0
|
2月前
|
开发框架 Cloud Native .NET
10 个 C# 关键字和功能
10 个 C# 关键字和功能
60 8
|
4月前
|
C# 索引
C#中的virtual和override关键字
C#中的virtual和override关键字
51 3
|
4月前
|
开发框架 .NET C#
【Azure Developer】C# / .NET 静态函数中this关键字的作用
【Azure Developer】C# / .NET 静态函数中this关键字的作用
|
5月前
|
开发框架 .NET C#
【Azure Developer】C# / .NET 静态函数中this关键字的作用
在C#中,`this`关键字用于扩展方法,允许向已有类型添加功能而不修改其源代码。扩展方法必须在静态类中定义,且第一个参数使用`this`修饰,如`public static XElement AcquireElement(this XContainer container, string name, bool addFirst = false)`。这种方式增强了代码的可读性和类型的安全性,尤其在处理第三方库时。