在实际环境中测试
在生产中测试无水印。
随时随地为您服务。
"(《世界人权宣言》)C# ref
关键字是每个初学者都应了解的基本工具。 它用于通过引用而不是值来传递参数或 args,允许在被调用方法内部对引用类型变量所做的更改反映到外部。 在本教程中,我们将详细介绍 **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
在上面的代码中,尽管我们在 IncrementByOne
方法中增加了 num
,但原始的 value
保持不变。 这是因为 num
是原始变量的副本,对其进行更改不会影响原始变量。
现在,让我们看看 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
请注意方法签名和调用中的 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
在本例中,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
在上面的示例中,我们重载了 Add
方法,使其同时适用于 int
和 double
类型。关键字 ref
允许方法直接修改原始变量。
另一个相关的关键词是 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
在此示例中,"Divide "方法计算商,并使用 "out "关键字将其赋值给 "quotient "变量。 值得注意的是,在将 result
传递给方法之前,您无需对其进行初始化。
out "关键字与 "ref "关键字相似,但有很大不同。 out "参数不需要初始值,而 "ref "参数在方法调用前必须有初始值。
虽然 "ref "和 "out "关键字是强有力的工具,但应谨慎使用。 不正确地使用这些关键词会导致代码混乱和意外行为。 例如,在未初始化的情况下,不能在 ref
或 out
参数中使用非引用变量,否则会导致编译错误。
在使用 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
如果您忘记在方法签名或方法调用中包含 ref
关键字,将导致编译器在编译时出错。
请注意,您不能在迭代器方法或 async
方法中使用 ref
参数,因为这些方法需要通过值传递参数。
除了了解 C# 中的 ref
关键字等关键概念外,还有一套强大的工具可以让开发人员的生活变得更加轻松。 Iron Suite 是一系列强大的工具和库,包括 IronPdf、IronXL、IronOCR 和 IronBarcode。 让我们一起来探索这些工具,看看它们如何在没有任何争论的情况下提升您的编码体验。
了解 IronPDF作为 Iron Suite 的重要组成部分。它是一个允许开发人员在 C# 中创建、读取和编辑 PDF 文件的库。 如果您想将 HTML 转换为 PDF,IronPDF 有您需要的工具。 查看将 HTML 转换为 PDF 的教程了解更多有关该功能的信息。
用 C# 处理 Excel 文件可能具有挑战性,但是IronXL 的特点简化这项任务。 它使您无需安装 Excel 即可读取、编写、编辑和处理 Excel 文件。 从导入数据到创建新的电子表格,IronXL.Excel 都能用 C# 处理。
光学字符识别(光学字符识别)可能很复杂,但了解 IronOCR用于简化流程。 使用该库,您可以读取图像中的文本并将其转换为机器可读文本。 无论您需要从扫描文档中提取文本,还是从图像中识别字符,IronOCR 都能提供帮助。
BarCode 常用于各行各业,有了它,在应用程序中处理条形码变得更加容易。IronBarcode 库. 该库可让您在 C# 中创建、读取和处理 BarCode。 IronBarcode 支持多种 QR 和 BarCode 格式。
您可能想知道这些工具与我们讨论过的 "ref "关键字有什么关系。 在处理涉及 PDF、Excel、OCR 或 BarCode 的复杂项目时,有效使用 ref
关键字和其他 C# 原则对于高效管理代码至关重要。
例如,在使用 IronXL.Excel 处理大型 Excel 文件时,使用 ref
关键字通过引用传递对象可以使您的代码更高效、更易于维护。 同样,使用 IronPdf 处理 PDF 文档可能涉及到 ref
关键字可以发挥作用的方法。
了解 ref
关键字等核心语言特性,并使用 Iron Suite 等工具,您就能拥有强大的组合,构建高效、健壮和多用途的应用程序。 Iron Suite 可与您现有的 C# 知识无缝结合,共同帮助您创建更专业、更复杂的解决方案。
C# 语言具有 ref
关键字等功能,为开发人员提供了强大的功能。 与 Iron Suite(包括 IronPDF、IronXL、IronOCR 和 IronBarcode)结合使用,可能性会变得更加广阔。
Iron Suite 的每个产品都提供了一个免费试用 Iron Suite此外,译文还应让您能够在不进行任何直接投资的情况下探索和使用这些工具的广泛功能。 如果您决定继续使用完整的许可证,单个组件的起价为 $749。
如果您觉得整个 Iron Suite 符合您的需求,还有一笔极好的交易在等着您。 您只需支付两个单独组件的价格,即可获得全套组件。