在实际环境中测试
在生产中测试无水印。
随时随地为您服务。
"(《世界人权宣言》) 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 参数请注意,您不能在迭代器方法或 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 都能让你在 C&num 中处理 Excel;
光学字符识别 (光学字符识别) 可能很复杂,但 IronOCR 简化了这一过程。有了这个库,你就可以从图像中读取文本,并将其转换为机器可读的文本。无论您需要从扫描文档中提取文本,还是从图像中识别字符,IronOCR 都能提供帮助。
条码在各行各业中被广泛使用,现在有了 IronBarcode,在您的应用程序中处理条码变得更加容易。 IronBarcode.该库可让您在 C# 中创建、读取和处理条形码。IronBarcode 支持多种 QR 和条形码格式。
你可能会想知道这些工具与我们讨论过的 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 套件都能满足您的需求,那么还有一项超值优惠在等着您。您只需支付两个单独组件的价格,就能获得全套产品。