C# 引用传递

12 2025年7月 | 阅读 6 分钟

在 C# 中,引用传递是一种将值传递给函数参数的系统化方法。它允许函数直接修改实际变量的值,因为实际参数和形式参数都引用同一个变量。如果在函数内部更改参数,可能会影响原始参数。它也称为按地址传递。

C# Call by Reference

语法

它具有以下语法:

在这里,我们需要在调用方法时使用 `ref` 关键字。

示例

让我们通过一个实例来演示 C# 中的引用传递。

示例

编译并运行

输出

Enter the first number: 5
Enter the second number: 2

Before modification, the values are:
x = 5, y = 2

After modification, the values are:
x = 15, y = 9

说明

在此示例中,我们使用 `ref` 关键字来演示引用传递函数。之后,两个整数参数通过 `ModifyValues()` 函数按引用修改,该函数将第一个值乘以三,并将第二个值增加 7。

在 `main()` 函数中,它首先要求用户输入两个整数,并在进行任何修改之前显示它们的值。之后,它调用 `ModifyValues(ref x, ref y)`,该函数使用引用传递直接更新原始值。

C# 引用传递中的方法

C# 中引用传递的几种方法如下:

1. 在 C# 中使用 `ref` (按引用传递)

在 C# 中,可以使用 `ref` 关键字按引用传递变量。这意味着在方法内部对变量所做的任何更改都会直接影响调用者范围内的原始值。`ref` 使方法能够直接操作实际变量本身。

使用 C# 中的 `ref` 关键字的示例

示例

编译并运行

输出

Before modifying the value is: 14
After modifying the value is: 42

说明

在此示例中,使用 `ref` 关键字按引用传递了一个整数变量,这使得方法能够更改变量的初始值。使用 `num_ber` 作为引用参数,`DoubleValue` 方法通过将变量乘以 3 来更新原始值变量。结果,当在 `main()` 函数中调用 `DoubleValue(ref value)` 时,修改继续进行,将值从 14 更改为 42。

2. 在 C# 中使用 `out` (按引用传递,无需初始化)

在 C# 中,方法可以通过使用 `out` 关键字按引用传递参数来返回多个值。`out` 关键字允许将未初始化的变量作为参数传递。但在方法结束之前,需要为该变量赋值。

为什么要在 C# 中使用 `out` 关键字?

当方法需要返回多个值但又不想使用元组或对象等复杂数据结构时,`out` 关键字尤其有用。它使方法能够一次修改多个变量,而无需显式的 return 语句

使用 C# 中的 `out` 关键字的示例

示例

编译并运行

输出

The First number is: 10
The Second number is: 20

说明

这个 C# 程序允许方法通过使用 `out` 关键字按引用传递变量来返回多个值。

3. 在 C# 中使用 `in` 关键字 (按只读引用传递)

C# 中,可以使用 `in` 关键字将变量作为只读 引用传递给方法。这确保了方法不能修改原始值。当处理大型结构或对象时,这很有用,因为它在保持原始数据完整性的同时,避免了不必要的内存复制。

使用 C# 中的 `in` 关键字的示例

让我们通过一个例子来演示 C# 中的 `in` 关键字。

示例

编译并运行

输出

Number: 70
Text: Hello Tpointtech

说明

此示例演示了如何将只读引用传递给 `in` 关键字中的方法。`LargeData` 结构中的一个 `int` (Num) 和一个 `string` (Text) 被传递给 `DisplayData` 方法,该方法只允许读取访问,并避免了不必要的内存复制。

何时在 C# 中使用引用传递?

  1. 修改原始变量:当方法需要修改变量的原始值而不是创建副本时,这很有用。
  2. 处理复杂数据类型:它适用于修改大型数据结构、数组或对象的的状态。
  3. 返回多个值:当方法想要在不依赖 return 值的情况下返回更多值时,它可能很有用。
  4. 增强代码灵活性:函数可以与变量交互,这使得代码灵活且可重用。

引用传递的优点

引用传递的几个优点如下:

  • 它有助于修改原始值。
  • 它对于修改大型数据结构中的实际数据很有用。
  • 它不会创建重复数据来在内存空间中存储值。

引用传递的缺点

引用传递的几个缺点如下:

  • 当多个引用指向同一数据时,更改一个引用会影响所有引用。
  • 调试变得更具挑战性。
  • 由于函数是按引用传递的,因此它不再是理论上纯粹的。

结论

在 C# 语言中,引用传递是一项关键功能,它允许对原始数据进行受控访问,从而在需要时进行修改,或通过只读访问等机制确保安全性。

C# 引用传递常见问题解答

1) C# 中的引用传递是什么?

在 C# 中,引用传递是一种将值传递给函数参数的方法。由于实际参数和形式参数都引用同一个变量,因此它有助于函数直接更改实际变量的值。如果在函数内部更改参数,可能会影响原始参数。

2) C# 中的值传递和引用传递有什么区别?

C# 中按值传递和按引用传递的主要区别如下。

按值传递:将值的副本传递给函数。它包括基本数据类型和简单数据类型,例如 int、float、char 等。

按引用传递:将值的地址传递给函数。它用于复杂数据类型,包括数组、结构体、字符串等。

3) C# 中引用传递的优点是什么?

C# 中引用传递的几个优点。

  • 引用传递会修改原始值。
  • 它不会创建重复数据来在内存空间中存储值。

4) C# 中的引用传递是如何实现的?

C# 中的引用传递是通过 `ref` 或 `out` 关键字实现的。

  • ref:使用 `ref` 关键字时,变量必须已初始化。
  • out:传递值之前,变量不需要初始化。

5) `ref` 和 `out` 关键字之间有什么区别?

`ref` 和 `out` 关键字之间的几个区别如下:

refout
使用 `ref` 关键字时,变量必须已初始化。传递值之前,变量不需要初始化。
我们可以在方法内修改该值。我们应该在方法内部分配值。
数据可以双向传递。数据可以单向传递。

下一主题C# Out 参数