.NET 帮助

C# 引用关键字(开发人员工作原理)

发布 2023年十一月13日
分享:

"(《世界人权宣言》) C# ref 关键字 是每个初学者都应该学习的基本工具。它用于通过引用而不是值来传递参数或 args,从而允许在被调用方法内部对引用类型变量所做的更改反映到外部。在本教程中,我们将详细介绍**ref 关键字,并通过各种控制台代码示例来说明它是如何工作的。

ref 关键字简介

在 C# 中传递方法参数时,默认情况下是通过值传递的。这意味着会创建参数值的副本,调用方法中的任何更改都不会影响方法外的原始变量。关键字 ref 改变了这种行为,允许通过引用传递参数。当参数通过引用传递时,方法内的任何更改都将直接影响方法外的原始变量。

关键概念

  • ref 关键字:用于表示变量通过引用传递。
  • 引用变量:引用存储数据的内存位置的类型。
  • 值类型:保存实际数据的类型。
  • 原始变量:使用 ref 关键字时,方法外部的变量反映了方法内部的变化。

参考传递

让我们先来了解一下变量如何通过引用传递的概念。想象一下,你有一个递增整数的方法,如下代码所示:

class Program
{
//method returns incremented value
    static void IncrementByOne(int num)
    {
        num++;
    }

    static void Main()
    {
        int value = 5;
        IncrementByOne(value);
        Console.WriteLine(value);  // Output: 5
    }
}
class Program
{
//method returns incremented value
    static void IncrementByOne(int num)
    {
        num++;
    }

    static void Main()
    {
        int value = 5;
        IncrementByOne(value);
        Console.WriteLine(value);  // Output: 5
    }
}
Friend Class Program
'method returns incremented value
	Private Shared Sub IncrementByOne(ByVal num As Integer)
		num += 1
	End Sub

	Shared Sub Main()
		Dim value As Integer = 5
		IncrementByOne(value)
		Console.WriteLine(value) ' Output: 5
	End Sub
End Class
VB   C#

在上面的代码中,即使我们在 IncrementByOne 方法中递增了 num,原来的 value 仍然保持不变。这是因为 num 是原始变量的副本,对它的更改不会影响原始变量。

使用 ref 关键字

现在,让我们看看 ref 关键字如何改变这种行为。通过使用 ref 关键字,你可以将一个变量通过引用传递给方法,如下例代码所示。

class Program
{
//ref int
    static void IncrementByOneRef(ref int num)
    {
        num++;
    }

    static void Main()
    {
        int value = 5;
        IncrementByOneRef(ref value);
        Console.WriteLine(value);  // Output: 6
    }
}
class Program
{
//ref int
    static void IncrementByOneRef(ref int num)
    {
        num++;
    }

    static void Main()
    {
        int value = 5;
        IncrementByOneRef(ref value);
        Console.WriteLine(value);  // Output: 6
    }
}
Friend Class Program
'ref int
	Private Shared Sub IncrementByOneRef(ByRef num As Integer)
		num += 1
	End Sub

	Shared Sub Main()
		Dim value As Integer = 5
		IncrementByOneRef(value)
		Console.WriteLine(value) ' Output: 6
	End Sub
End Class
VB   C#

请注意方法签名和调用中的 ref 关键字。这就告诉 C#,你想通过引用来传递 value 变量。因此,在 IncrementByOneRef 方法中所做的更改会反映在原始的 value 变量中。

使用值类型

在处理整数、双倍和结构体等类型时,ref 关键字尤其有用。这些类型直接存储在内存中,通过引用传递它们可以提高性能并更精确地控制数据操作。

修改参考变量

虽然 ref 关键字通常与值类型相关联,但它也可用于引用类型变量。引用类型(如类和数组)存储的是对内存中实际数据的引用,而不是数据本身。这意味着你要处理的是一个类似指针的结构,通过引用传递会产生不同的结果,如下例所示:

class Person
{
    public string Name { get; set; }
}

class Program
{
    //method
    static void ChangeName(ref Person person)
    {
        //new object
        person = new Person { Name = "Alice" };
    }

    static void Main()
    {
        Person person = new Person { Name = "Bob" };
        ChangeName(ref person);
        Console.WriteLine(person.Name);  // Output: Alice
    }
}
class Person
{
    public string Name { get; set; }
}

class Program
{
    //method
    static void ChangeName(ref Person person)
    {
        //new object
        person = new Person { Name = "Alice" };
    }

    static void Main()
    {
        Person person = new Person { Name = "Bob" };
        ChangeName(ref person);
        Console.WriteLine(person.Name);  // Output: Alice
    }
}
Friend Class Person
	Public Property Name() As String
End Class

Friend Class Program
	'method
	Private Shared Sub ChangeName(ByRef person As Person)
		'new object
		person = New Person With {.Name = "Alice"}
	End Sub

	Shared Sub Main()
		Dim person As New Person With {.Name = "Bob"}
		ChangeName(person)
		Console.WriteLine(person.Name) ' Output: Alice
	End Sub
End Class
VB   C#

在本例中,"ChangeName "方法将 "person "变量的引用更改为一个新的 "Person "对象。结果,原来的 person 变量现在指向了一个不同的对象,它的名字是 "Alice"。

使用引用类型参数的方法重载

你可以使用多个名称相同但参数不同的方法。这就是所谓的方法重载。当使用 ref 关键字时,方法重载变得更加强大。

class Calculator
{
    public static void Add(ref int x, int y)
    {
        x += y;
    }

    public static void Add(ref double x, double y)
    {
        x += y;
    }
}

class Program
{
    static void Main()
    {
        int intValue = 5;
        double doubleValue = 7.5;
        //ref parameter
        Calculator.Add(ref intValue, 3);
        Calculator.Add(ref doubleValue, 2.5);

        Console.WriteLine(intValue);      // Output: 8
        Console.WriteLine(doubleValue);   // Output: 10.0
    }
}
class Calculator
{
    public static void Add(ref int x, int y)
    {
        x += y;
    }

    public static void Add(ref double x, double y)
    {
        x += y;
    }
}

class Program
{
    static void Main()
    {
        int intValue = 5;
        double doubleValue = 7.5;
        //ref parameter
        Calculator.Add(ref intValue, 3);
        Calculator.Add(ref doubleValue, 2.5);

        Console.WriteLine(intValue);      // Output: 8
        Console.WriteLine(doubleValue);   // Output: 10.0
    }
}
Friend Class Calculator
	Public Shared Sub Add(ByRef x As Integer, ByVal y As Integer)
		x += y
	End Sub

	Public Shared Sub Add(ByRef x As Double, ByVal y As Double)
		x += y
	End Sub
End Class

Friend Class Program
	Shared Sub Main()
		Dim intValue As Integer = 5
		Dim doubleValue As Double = 7.5
		'ref parameter
		Calculator.Add(intValue, 3)
		Calculator.Add(doubleValue, 2.5)

		Console.WriteLine(intValue) ' Output: 8
		Console.WriteLine(doubleValue) ' Output: 10.0
	End Sub
End Class
VB   C#

在上面的示例中,我们重载了 Add 方法,使其同时适用于 intdouble 类型。关键字 ref 允许方法直接修改原始变量。

使用 out 关键字

另一个相关的关键字是 out。它与 ref 类似,但目的略有不同。ref 希望变量在传递之前就被初始化,而 out 关键字则用于方法为不一定有初始值的参数赋值:

class Program
{
    static void Divide(int dividend, int divisor, out int quotient)
    {
        quotient = dividend / divisor;
    }

    static void Main()
    {
        int result;
        Divide(10, 2, out result);
        Console.WriteLine(result);  // Output: 5
    }
}
class Program
{
    static void Divide(int dividend, int divisor, out int quotient)
    {
        quotient = dividend / divisor;
    }

    static void Main()
    {
        int result;
        Divide(10, 2, out result);
        Console.WriteLine(result);  // Output: 5
    }
}
Friend Class Program
	Private Shared Sub Divide(ByVal dividend As Integer, ByVal divisor As Integer, ByRef quotient As Integer)
		quotient = dividend \ divisor
	End Sub

	Shared Sub Main()
		Dim result As Integer = Nothing
		Divide(10, 2, result)
		Console.WriteLine(result) ' Output: 5
	End Sub
End Class
VB   C#

在本例中,"Divide "方法计算商,并使用 "out "关键字将其赋值给 "quotient "变量。值得注意的是,在将 result 传递给方法之前,不需要对它进行初始化。

ref 与 out 关键字的区别

out "关键字与 "ref "关键字相似,但有很大不同。out 参数不需要初始值,而 ref 参数在方法调用前必须有初始值。

潜在陷阱

虽然 refout 关键字是强大的工具,但应谨慎使用。不正确地使用这些关键字会导致代码混乱和意想不到的行为。例如,在未初始化的情况下,不能在 refout 参数中使用非引用变量,否则会导致编译错误。

ref 关键字的高级用法

使用引用类型和值类型

在使用 ref 关键字时,了解两个引用和值类型之间的区别至关重要。

  • 引用类型:变量指内存中存储数据的位置,如对象、数组等。
  • 值类型:变量直接包含数据,如整数、浮点数等。

在值类型中使用 ref 可以将变化反映到方法之外,而引用类型变量本来就有这种行为。

带有 ref 关键字的扩展方法

您也可以在扩展方法中使用 ref 关键字。举个例子

public static class StringExtensions
{
//example
    public static void AppendValue(ref this string input, string value)
    {
        input += value;
    }
}
public static class StringExtensions
{
//example
    public static void AppendValue(ref this string input, string value)
    {
        input += value;
    }
}
Public Module StringExtensions
'example
	Public Sub AppendValue(ByRef Me input As String, ByVal value As String)
		input &= value
	End Sub
End Module
VB   C#

编译器错误和 ref 关键字

如果忘记在方法签名或方法调用中包含 ref 关键字,编译时将导致编译器错误。

Async方法和 ref 参数

请注意,您不能在迭代器方法或 async 方法中使用 ref 参数,因为这些方法需要通过值传递参数。

钢铁套房介绍

除了了解 C# 中的 ref 关键字等关键概念外,还有一套强大的工具可以让开发人员的生活变得更加轻松。Iron Suite 集合了一系列强大的工具和库,包括 IronPDF、IronXL、IronOCR 和 IronBarcode。让我们一起来探索这些工具,看看它们是如何不费吹灰之力就能提升你的编码体验的。

IronPDF PDF 处理轻松搞定

IronPDF 是 Iron Suite 的重要组成部分。它是一个允许开发人员在 C# 中创建、读取和编辑 PDF 文件的库。如果您想将 HTML 转换为 PDF,IronPDF 就是您需要的工具。查看 HTML 转 PDF 教程 了解更多有关该功能的信息。

指尖上的 IronXL Excel 操作

用 C# 处理 Excel 文件可能很有挑战性,但是 IronXL 简化了这一任务。它能让你在没有安装 Excel 的情况下读取、写入、编辑和处理 Excel 文件。从导入数据到创建新的电子表格,IronXL 都能让你在 C&num 中处理 Excel;

IronOCR 用于 C&num 的光学字符识别;

光学字符识别 (光学字符识别) 可能很复杂,但 IronOCR 简化了这一过程。有了这个库,你就可以从图像中读取文本,并将其转换为机器可读的文本。无论您需要从扫描文档中提取文本,还是从图像中识别字符,IronOCR 都能提供帮助。

IronBarcode 条码生成和读取

条码在各行各业中被广泛使用,现在有了 IronBarcode,在您的应用程序中处理条码变得更加容易。 IronBarcode.该库可让您在 C# 中创建、读取和处理条形码。IronBarcode 支持多种 QR 和条形码格式。

Iron Suite 与 ref 关键字的关系

你可能会想知道这些工具与我们讨论过的 ref 关键字有什么关系。在处理涉及 PDF、Excel、OCR 或条形码的复杂项目时,有效使用 ref 关键字和其他 C# 原则对于高效管理代码至关重要。

例如,在使用 IronXL 处理大型 Excel 文件时,使用 ref 关键字通过引用传递对象可以使代码更高效、更易于维护。同样,在使用 IronPDF 处理 PDF 文档时,ref关键字也会发挥作用。

了解 ref 关键字等核心语言特性,并使用 Iron Suite 等工具,这将为您构建高效、强大和多用途的应用程序提供强大的组合。Iron Suite 可以与您现有的 C# 知识无缝结合,共同帮助您创建更专业、更复杂的解决方案。

结论

C# 语言的 ref 关键字等功能为开发人员提供了强大的功能。与包括 IronPDF、IronXL、IronOCR 和 IronBarcode 在内的 Iron Suite 相结合,可能性变得更加广阔。

Iron 套装中的每个产品都能提供 免费试用,让您无需立即投资即可探索和使用广泛的功能。如果您决定使用完整许可证,单个组件的价格从 $749 起。

如果您觉得整个 Iron 套件都能满足您的需求,那么还有一项超值优惠在等着您。您只需支付两个单独组件的价格,就能获得全套产品。

< 前一页
C# Datatable 转 List(开发者如何使用)
下一步 >
NLog C#(适用于开发人员的工作原理)

准备开始了吗? 版本: 2024.9 刚刚发布

免费NuGet下载 总下载量: 10,746,704 查看许可证 >