跳至页脚内容
.NET 帮助

C# 引用传递(开发者用法)

在编程世界中,高效的内存管理和数据操作是构建高性能代码的基本组成部分。 编写有效且无错误的代码需要了解如何在诸如 C# 之类的语言中,在方法和函数之间传递数据。 这个过程至关重要的一个概念是“按引用传递”。我们将在这篇文章中探索在 C# 中按引用传递的意义以及合适的使用场景。

如何使用 C# 按引用传递

  1. 使用 ref 参数定义一个方法。
  2. 初始化一个变量。
  3. 使用 ref 关键字调用方法。
  4. 在方法内部修改变量。
  5. 在主方法中观察变化。
  6. 使用 Out 参数定义另一个生成 PDF 的方法。
  7. 初始化并调用 Out 方法。

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

利用引用传递是指在 C# 中通过提供调用方法的初始变量引用而不是其值的副本来向函数或方法发送参数的方式。 这意味着在方法内部对参数所做的任何更改也会影响到方法外的初始变量。

C# 中的值类型变量(如 int、float、bool 等)通常是按值提供的,这意味着方法接收到变量值的副本。 然而,您可以使用 ref 关键字来告诉编译器按引用传递参数。

使用 ref 关键字

在 C# 中,可以通过使用 ref 关键字来为按引用传递的引用参数提供参数。 通过 ref 关键字按引用提供的参数所做的任何修改都会对原始变量产生影响。

class Program
{
    static void Main(string[] args)
    {
        int num = 10;
        Console.WriteLine("Before: " + num); // Output: Before: 10
        ModifyByRef(ref num);
        Console.WriteLine("After: " + num);  // Output: After: 20
    }

    // Method that modifies the integer by reference
    static void ModifyByRef(ref int x)
    {
        x = x * 2; // Modify the original value by reference
    }
}
class Program
{
    static void Main(string[] args)
    {
        int num = 10;
        Console.WriteLine("Before: " + num); // Output: Before: 10
        ModifyByRef(ref num);
        Console.WriteLine("After: " + num);  // Output: After: 20
    }

    // Method that modifies the integer by reference
    static void ModifyByRef(ref int x)
    {
        x = x * 2; // Modify the original value by reference
    }
}
Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim num As Integer = 10
		Console.WriteLine("Before: " & num) ' Output: Before: 10
		ModifyByRef(num)
		Console.WriteLine("After: " & num) ' Output: After: 20
	End Sub

	' Method that modifies the integer by reference
	Private Shared Sub ModifyByRef(ByRef x As Integer)
		x = x * 2 ' Modify the original value by reference
	End Sub
End Class
$vbLabelText   $csharpLabel

上例中的 ModifyByRef 方法使用 ref 关键字按引用接收一个整数参数 x。 当使用 ref num 调用该方法时,对方法内部 x 的 ref 参数所做的任何修改都会立即影响到方法外的 num 变量。

out 关键字

out 关键字用于按引用将参数传递给调用方法,就像 ref 一样。 因此,方法能够返回多个值。

class Program
{
    static void Main(string[] args)
    {
        int result;
        Calculate(10, 5, out result);
        Console.WriteLine("Result: " + result); // Output: Result: 15
    }

    // Method that calculates the sum of two integers and outputs the result by reference
    static void Calculate(int x, int y, out int result)
    {
        result = x + y; // Assign the sum to the out parameter
    }
}
class Program
{
    static void Main(string[] args)
    {
        int result;
        Calculate(10, 5, out result);
        Console.WriteLine("Result: " + result); // Output: Result: 15
    }

    // Method that calculates the sum of two integers and outputs the result by reference
    static void Calculate(int x, int y, out int result)
    {
        result = x + y; // Assign the sum to the out parameter
    }
}
Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim result As Integer = Nothing
		Calculate(10, 5, result)
		Console.WriteLine("Result: " & result) ' Output: Result: 15
	End Sub

	' Method that calculates the sum of two integers and outputs the result by reference
	Private Shared Sub Calculate(ByVal x As Integer, ByVal y As Integer, ByRef result As Integer)
		result = x + y ' Assign the sum to the out parameter
	End Sub
End Class
$vbLabelText   $csharpLabel

在此示例中,将两个整数参数 xy 以及由 out 关键字表示的额外参数 result 传递给 Calculate 方法。 在过程计算完 xy 的总和后,结果被赋值给 result 参数。 result 在发送给方法之前无需初始化,因为它被标记为 out

何时使用按引用传递

编写高效和可维护的代码需要知道何时使用按引用传递。 以下情况需要使用按引用传递:

修改多个变量

当一个方法需要改变多个变量,并且这些变化需要在方法外反映时,通过引用传递参数可能会很有帮助。 变量可以通过引用发送,并在方法内部直接更改,而不需要让过程返回多个值。

// Method that modifies multiple variables by reference
static void ModifyMultipleByRef(ref int a, ref int b)
{
    a *= 2; // Double the first variable
    b *= 3; // Triple the second variable
}
// Method that modifies multiple variables by reference
static void ModifyMultipleByRef(ref int a, ref int b)
{
    a *= 2; // Double the first variable
    b *= 3; // Triple the second variable
}
' Method that modifies multiple variables by reference
Shared Sub ModifyMultipleByRef(ByRef a As Integer, ByRef b As Integer)
	a *= 2 ' Double the first variable
	b *= 3 ' Triple the second variable
End Sub
$vbLabelText   $csharpLabel

大数据结构

通过引用传递大数据结构(如数组或复杂对象)可以提高效率,避免不必要的数据复制。 然而,在处理大数据结构时,应谨慎使用按引用传递,因为如果处理不当可能会产生意想不到的后果。

与外部代码的互操作性

在与外部库交互或整合本地代码时,可能需要按引用发送参数,以遵循方法定义和外部代码的要求。

什么是 IronPDF? [IronPDF](/) 允许程序员在 .NET 应用程序中创建、修改和渲染 PDF 文档。 其丰富的功能集使处理 PDF 文件变得简单。 您可以从 HTML、图像和其他格式创建 PDF 文档; 使用文本、图像和其他数据注释 PDF; 并分割、合并和编辑现有的 PDF 文档。 IronPDF 的主要特点是其将 [HTML 转换为 PDF](/tutorials/html-to-pdf/) 的能力,确保布局和样式的保留。 这个功能非常适合从基于 Web 的内容(如报告、发票和文档)生成 PDF。 它将 HTML 文件、URL 和 HTML 字符串转换为 PDF 文件。 ```csharp using IronPdf; class Program { static void Main(string[] args) { var renderer = new ChromePdfRenderer(); // 1. Convert HTML String to PDF var htmlContent = "

Hello, IronPDF!

This is a PDF from an HTML string.

"; var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent); pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf"); // 2. Convert HTML File to PDF var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath); pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf"); // 3. Convert URL to PDF var url = "http://ironpdf.com"; // Specify the URL var pdfFromUrl = renderer.RenderUrlAsPdf(url); pdfFromUrl.SaveAs("URLToPDF.pdf"); } } ``` ### IronPDF的功能 #### 文本和图像注释 IronPDF 允许您以编程方式向 PDF 文档添加文本、图像和注释。 该功能使您可以使用签名、印章和备注注释 PDF 文件。 #### PDF 安全 IronPDF 允许您指定不同的权限,包括打印、复制内容和编辑文档,并且可以使用密码加密 PDF 文档。 这有助于您控制对 PDF 文件的访问并保护敏感数据。 #### 填写交互式 PDF 表单 IronPDF 允许您以编程方式填写交互式 PDF 表单。 此功能对于使用用户输入创建定制化文件或自动化表单提交非常有用。 #### PDF 压缩和优化 为了在不牺牲质量的情况下减小文件大小,IronPDF 提供了 PDF 文件的压缩和优化方案。 这不仅减少了 PDF 文档所需的存储量,还提高了性能。 #### 跨平台兼容性 IronPDF 旨在与 Windows、Linux 和 macOS 等平台上的 .NET 应用程序无缝协作。 它与流行的 .NET 框架(如 ASP.NET、.NET Core 和 Xamarin)集成。 ## 创建新的Visual Studio项目 使用 Visual Studio 创建一个控制台项目很容易。 要在 Visual Studio 中创建控制台应用程序,请执行以下操作: 在开始[Visual Studio 开发](https://visualstudio.microsoft.com)之前,请确保已在计算机上安装它。 #### 启动新项目 选择文件,然后选择新建,最后选择项目。 ![C# 按引用传递(开发人员如何运作):图 1](/static-assets/pdf/blog/csharp-pass-by-reference/csharp-pass-by-reference-1.webp) 在“创建新项目”框的左侧,选择您偏好的编程语言(例如 C#)。 可以从以下项目模板列表中选择 “控制台应用程序” 或 “控制台应用程序(.NET Core)” 模板。 在“名称”字段中为您的项目提供名称。 ![C# 按引用传递(开发人员如何运作):图 2](/static-assets/pdf/blog/csharp-pass-by-reference/csharp-pass-by-reference-2.webp) 选择您想存储项目的存储位置。 按“创建”以启动控制台应用程序项目。 ![C# 按引用传递(开发人员如何运作):图 3](/static-assets/pdf/blog/csharp-pass-by-reference/csharp-pass-by-reference-3.webp) ## 安装 IronPDF 在 Visual Studio 工具下,您可以找到 Visual 命令行界面。 选择 NuGet 包管理器。 在包管理终端选项卡上,您必须键入以下命令。 ```shell :ProductInstall ``` 另一个选择是使用包管理器。 使用 NuGet 包管理器选项可以将包直接安装到解决方案中。 使用 NuGet 网站的搜索框来定位包。 以下示例截图说明了在包管理器中查找“IronPDF”的轻松程度: ![C# 按引用传递(开发人员如何运作):图 4 - 从 NuGet 包管理器安装 IronPDF](/static-assets/pdf/blog/csharp-pass-by-reference/csharp-pass-by-reference-4.webp) 相关搜索结果列表可以在上图中看到。 请调整这些设置以启用您计算机上的软件安装。 一旦包下载并安装后,现在可以在当前项目中使用。 ### 使用 IronPDF 进行按引用传递 这是如何使用 IronPDF 的按引用传递功能的示例。 ```csharp using IronPdf; using System; class Program { static void Main(string[] args) { // Create a PDF document var pdf = new IronPdf.HtmlToPdf(); // HTML content to be converted to PDF string htmlContent = "

Hello, IronPDF!

"; // Create a byte array to store the PDF content byte[] pdfBytes; // Convert HTML to PDF and pass the byte array by reference ConvertHtmlToPdf(pdf, htmlContent, out pdfBytes); // Save or process the PDF content // For demonstration, let's print the length of the PDF content Console.WriteLine("Length of PDF: " + pdfBytes.Length); } // Method that converts HTML content to PDF and stores it in a byte array by reference static void ConvertHtmlToPdf(IronPdf.HtmlToPdf pdfConverter, string htmlContent, out byte[] pdfBytes) { // Convert HTML to PDF and store the result in the byte array var pdfDoc = pdfConverter.RenderHtmlAsPdf(htmlContent); pdfBytes = pdfDoc.BinaryData; } } ``` 在该示例中,`ConvertHtmlToPdf` 函数接收三个参数:HTML 内容,一个名为 `pdfBytes` 的字节数组和一个 IronPDF 的 `HtmlToPdf` 对象。 `out` 关键字表示 `pdfBytes` 参数是按引用提供的,并将在方法内更改。 ![C# 按引用传递(开发人员如何运作):图 5](/static-assets/pdf/blog/csharp-pass-by-reference/csharp-pass-by-reference-5.webp) 在 `ConvertHtmlToPdf` 函数中,HTML 内容被 IronPDF 渲染为 PDF 文档,结果的二进制数据存储在 `pdfBytes` 数组中。 我们在主函数中再次使用 [IronPDF HTML 到 PDF 转换](/tutorials/html-to-pdf/),通过引用传递 `pdfBytes` 数组。 在方法调用之后,IronPDF 的 PDF 内容存储在 `pdfBytes` 数组的内存位置中。 ![C# 按引用传递(开发人员如何运作):图 6](/static-assets/pdf/blog/csharp-pass-by-reference/csharp-pass-by-reference-6.webp) 这向您展示了如何使用 IronPDF 和 C# 中的按引用传递高效地创建和处理 PDF 文档。 ## 结论 总之,在 C# 中使用 IronPDF 和按引用传递显著提高了在 .NET 程序中创建和修改 PDF 文档的能力。 有效使用 `ref` 和 `out` 关键字使开发人员能够轻松地按引用传递参数,使变量和内容能够快速高效地在方法内修改。 IronPDF 的广泛功能,包括将 HTML 转换为 PDF、根据图像生成 PDF 以及执行广泛的 PDF 修改任务,使开发人员能够轻松构建动态和交互式 PDF 文档。 IronPDF 提供了加快文档处理流程所需的工具和 API,包括拆分、合并、注释和优化 PDF 文件。 此外,IronPDF 的跨平台互操作性确保了 C# 应用程序能够在多种环境中轻松融合 PDF 功能。 基本上,通过将 C# 的按引用传递功能与 IronPDF 丰富的功能集相结合,开发人员能够在其应用程序中创造新的创建、修改和展示 PDF 文档的途径。 最后,您可以高效地处理 Excel、制作 PDF、执行 OCR 和使用条形码。 [每个库的价格起价为 $799](ironsuite)。 如果有明确的许可选项针对项目的需求量身定制,开发人员能够自信地选择最好的模式。 通过这些优势,开发人员可以高效且透明地应对各种挑战。

常见问题解答

如何在C#中将HTML转换为PDF?

你可以使用IronPDF的RenderHtmlAsPdf方法将HTML字符串转换为PDF。此方法可以轻松将网页或HTML内容转换为高质量的PDF文档,同时保持原始布局和格式。

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

C#中的引用传递是指通过提供原始变量的引用而不是其值的副本来将参数传递给函数或方法。这允许在方法内对参数所做的更改影响原始变量。

如何在C#中使用'ref'和'out'关键字?

在C#中,'ref'关键字用于按引用传递参数,允许在方法内部进行修改以影响原始变量。'out'关键字类似,但不要求变量事先初始化,从而使方法能够返回多个值。

什么时候应该在C#中使用引用传递?

当需要修改多个变量、处理大型数据结构以避免不必要的复制或与需要引用参数的外部库交互时,应使用引用传递。

PDF处理库如何利用引用传递?

像IronPDF这样的PDF处理库可以利用引用传递,通过'out'关键字将PDF数据存储在字节数组中。这允许在方法内高效处理和修改PDF内容,例如将HTML转换为PDF并将结果存储在字节数组中。

在.NET中使用PDF处理库有什么优势?

像IronPDF这样的PDF处理库提供HTML到PDF转换、文本和图像注释、PDF安全性、表单填写、压缩和优化等功能。它与.NET应用程序兼容,增强了功能性和跨平台兼容性。

如何在Visual Studio项目中安装PDF处理库?

可以使用NuGet包管理器在Visual Studio项目中安装PDF处理库。在包管理终端中使用适当的命令,或在NuGet包管理器界面中搜索库。

IronPDF可以与ASP.NET和.NET Core一起使用吗?

可以,IronPDF旨在与ASP.NET和.NET Core应用程序完美集成,允许开发人员在各种平台上创建、修改和呈现PDF文档。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。