在实际环境中测试
在生产中测试无水印。
随时随地为您服务。
即使您刚刚接触 C#,您也可能已经接触过 using 指令。如果你是 IronPDF 的用户,你一定会对使用命名空间 "using ironpdf "来启动代码非常熟悉。
不过,using 关键字还有另一种用途。 在本指南中,我们将介绍 using 语句--它是什么、如何工作以及如何帮助您创建更高效的代码。 让我们深入了解!
C# 中的 using 语句是一种使用实现 IDisposable 接口的资源的便捷方法。 IDisposable 对象通常保存着未管理的资源,如文件句柄或网络连接,使用完毕后需要释放这些资源。 这就是使用说明发挥作用的地方--它可以帮助您确保这些资源在使用后得到妥善处理。
当您使用 using 语句时,C# 会在不再需要该对象时自动调用其 Dispose 方法。 这意味着您不必手动调用 Dispose 方法,也不必担心忘记调用。 使用说明将为您解决这个问题!
让我们看一个简单的例子,了解 using 语句是如何发挥作用的:
using System.IO;
class Program
{
static void Main()
{
using (StreamReader reader = new StreamReader("example.txt"))
{
string content = reader.ReadToEnd();
Console.WriteLine(content);
}
}
}
using System.IO;
class Program
{
static void Main()
{
using (StreamReader reader = new StreamReader("example.txt"))
{
string content = reader.ReadToEnd();
Console.WriteLine(content);
}
}
}
Imports System.IO
Friend Class Program
Shared Sub Main()
Using reader As New StreamReader("example.txt")
Dim content As String = reader.ReadToEnd()
Console.WriteLine(content)
End Using
End Sub
End Class
在本例中,名为 reader 的 StreamReader 对象被封装在一个 using 块中。 当 using 块退出时,阅读器会自动调用 Dispose 方法,释放它所占用的资源。
从 C# 8.0 开始,您可以使用 using 声明代替 using 块。 using 声明是定义一次性对象的一种更简短、更简洁的方法,如下面这样:
using System.IO;
class Program
{
static void Main()
{
using var reader = new StreamReader("example.txt");
string content = reader.ReadToEnd();
Console.WriteLine(content);
}
}
using System.IO;
class Program
{
static void Main()
{
using var reader = new StreamReader("example.txt");
string content = reader.ReadToEnd();
Console.WriteLine(content);
}
}
Imports System.IO
Friend Class Program
Shared Sub Main()
Dim reader = New StreamReader("example.txt")
Dim content As String = reader.ReadToEnd()
Console.WriteLine(content)
End Sub
End Class
有了 using 声明,您就不需要大括号或缩进,从而使您的代码更具可读性。 当变量离开作用域时,仍会自动调用 Dispose 方法。
您可能想知道 using 语句与 C# 中的 try 和 finally 块有什么关系。 那么,using 语句实际上是 try-finally 块的简写!
下面是与之前相同的示例,但在编写时使用了 try-finally 块而不是 using 语句:
using System.IO;
class Program
{
static void Main()
{
StreamReader reader = null;
try
{
reader = new StreamReader("example.txt");
string content = reader.ReadToEnd();
Console.WriteLine(content);
}
finally
{
if (reader != null)
{
reader.Dispose();
}
}
}
}
using System.IO;
class Program
{
static void Main()
{
StreamReader reader = null;
try
{
reader = new StreamReader("example.txt");
string content = reader.ReadToEnd();
Console.WriteLine(content);
}
finally
{
if (reader != null)
{
reader.Dispose();
}
}
}
}
Imports System.IO
Friend Class Program
Shared Sub Main()
Dim reader As StreamReader = Nothing
Try
reader = New StreamReader("example.txt")
Dim content As String = reader.ReadToEnd()
Console.WriteLine(content)
Finally
If reader IsNot Nothing Then
reader.Dispose()
End If
End Try
End Sub
End Class
正如你所看到的,using语句通过消除对try-finally块和显式调用Dispose方法的需求,使代码更简洁易读。
using statement 的一大优点是可以同时处理多个资源。 您可以一个接一个地堆叠 using 语句,也可以使用单个 using 语句来处理逗号分隔列表中的多个资源。下面的示例演示了这两种方法:
using System.IO;
class Program
{
static void Main()
{
using (StreamReader reader1 = new StreamReader("example1.txt"))
using (StreamReader reader2 = new StreamReader("example2.txt"))
{
string content1 = reader1.ReadToEnd();
string content2 = reader2.ReadToEnd();
Console.WriteLine($"Content from example1.txt:\n{content1}\nContent from example2.txt:\n{content2}");
}
// Alternatively, you can use a single using statement with multiple resources:
using (StreamReader reader1 = new StreamReader("example1.txt"), reader2 = new StreamReader("example2.txt"))
{
string content1 = reader1.ReadToEnd();
string content2 = reader2.ReadToEnd();
Console.WriteLine($"Content from example1.txt:\n{content1}\nContent from example2.txt:\n{content2}");
}
}
}
using System.IO;
class Program
{
static void Main()
{
using (StreamReader reader1 = new StreamReader("example1.txt"))
using (StreamReader reader2 = new StreamReader("example2.txt"))
{
string content1 = reader1.ReadToEnd();
string content2 = reader2.ReadToEnd();
Console.WriteLine($"Content from example1.txt:\n{content1}\nContent from example2.txt:\n{content2}");
}
// Alternatively, you can use a single using statement with multiple resources:
using (StreamReader reader1 = new StreamReader("example1.txt"), reader2 = new StreamReader("example2.txt"))
{
string content1 = reader1.ReadToEnd();
string content2 = reader2.ReadToEnd();
Console.WriteLine($"Content from example1.txt:\n{content1}\nContent from example2.txt:\n{content2}");
}
}
}
Imports Microsoft.VisualBasic
Imports System.IO
Friend Class Program
Shared Sub Main()
Using reader1 As New StreamReader("example1.txt")
Using reader2 As New StreamReader("example2.txt")
Dim content1 As String = reader1.ReadToEnd()
Dim content2 As String = reader2.ReadToEnd()
Console.WriteLine($"Content from example1.txt:" & vbLf & "{content1}" & vbLf & "Content from example2.txt:" & vbLf & "{content2}")
End Using
End Using
' Alternatively, you can use a single using statement with multiple resources:
Using reader1 As New StreamReader("example1.txt"), reader2 As New StreamReader("example2.txt")
Dim content1 As String = reader1.ReadToEnd()
Dim content2 As String = reader2.ReadToEnd()
Console.WriteLine($"Content from example1.txt:" & vbLf & "{content1}" & vbLf & "Content from example2.txt:" & vbLf & "{content2}")
End Using
End Sub
End Class
这两种方法都会确保在退出using块时对每个StreamReader对象调用Dispose方法,释放它们所占用的任何资源。
有时,您可能会创建自己的自定义类来管理一个或多个资源。 如果您的类负责处理一次性对象或非托管资源,则应实现 IDisposable 接口。
下面是一个实现 IDisposable 接口的自定义类的示例:
using System;
using System.IO;
public class CustomResource : IDisposable
{
private StreamReader _reader;
public CustomResource(string filePath)
{
_reader = new StreamReader(filePath);
}
public void ReadContent()
{
string content = _reader.ReadToEnd();
Console.WriteLine(content);
}
public void Dispose()
{
if (_reader != null)
{
_reader.Dispose();
_reader = null;
}
}
}
using System;
using System.IO;
public class CustomResource : IDisposable
{
private StreamReader _reader;
public CustomResource(string filePath)
{
_reader = new StreamReader(filePath);
}
public void ReadContent()
{
string content = _reader.ReadToEnd();
Console.WriteLine(content);
}
public void Dispose()
{
if (_reader != null)
{
_reader.Dispose();
_reader = null;
}
}
}
Imports System
Imports System.IO
Public Class CustomResource
Implements IDisposable
Private _reader As StreamReader
Public Sub New(ByVal filePath As String)
_reader = New StreamReader(filePath)
End Sub
Public Sub ReadContent()
Dim content As String = _reader.ReadToEnd()
Console.WriteLine(content)
End Sub
Public Sub Dispose() Implements IDisposable.Dispose
If _reader IsNot Nothing Then
_reader.Dispose()
_reader = Nothing
End If
End Sub
End Class
在本例中,CustomResource 类管理着一个 StreamReader 对象,这是一个一次性对象。 通过实现 IDisposable 接口和 Dispose 方法,我们可以对该类的实例使用 using 语句。
以下是如何将 using 语句与 CustomResource 类结合使用:
class Program
{
static void Main()
{
using (CustomResource resource = new CustomResource("example.txt"))
{
resource.ReadContent();
}
}
}
class Program
{
static void Main()
{
using (CustomResource resource = new CustomResource("example.txt"))
{
resource.ReadContent();
}
}
}
Friend Class Program
Shared Sub Main()
Using resource As New CustomResource("example.txt")
resource.ReadContent()
End Using
End Sub
End Class
当using块终止时,将调用Dispose方法,释放它所管理的StreamReader对象。
using 语句的另一个好处是有助于更优雅地处理异常。 如果在 using 块中出现异常,仍将调用资源的 Dispose 方法,以确保正确清理。
例如,请考虑以下代码:
using System;
using System.IO;
class Program
{
static void Main()
{
try
{
using (StreamReader reader = new StreamReader("nonexistentfile.txt"))
{
string content = reader.ReadToEnd();
Console.WriteLine(content);
}
}
catch (FileNotFoundException ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}
}
using System;
using System.IO;
class Program
{
static void Main()
{
try
{
using (StreamReader reader = new StreamReader("nonexistentfile.txt"))
{
string content = reader.ReadToEnd();
Console.WriteLine(content);
}
}
catch (FileNotFoundException ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}
}
Imports System
Imports System.IO
Friend Class Program
Shared Sub Main()
Try
Using reader As New StreamReader("nonexistentfile.txt")
Dim content As String = reader.ReadToEnd()
Console.WriteLine(content)
End Using
Catch ex As FileNotFoundException
Console.WriteLine($"Error: {ex.Message}")
End Try
End Sub
End Class
在这种情况下,如果代码抛出 FileNotFoundException,异常会被 catch 块捕获并处理。 尽管异常发生在 using 块中,但仍会调用 StreamReader 对象的 Dispose 方法,以确保没有资源泄漏。
IronPDF 是一种流行的库,用于在 C# 和 .NET 应用程序中创建、编辑和提取 PDF 文件。 与其他使用资源的库一样,IronPdf 也可以从 using 语句中受益,以确保适当的资源管理。
让我们来探讨如何在 IronPDF 中使用 using 语句从 HTML 字符串创建 PDF 文档,在实际场景中展示 using 语句的威力。
首先,确保您已在项目中安装 IronPDF NuGet 包:
安装-打包 IronPdf
现在,让我们从 PDF 文件中提取所有数据:
using IronPdf;
class Program
{
static void Main()
{
using (PdfDocument pdfDocument = PdfDocument.FromFile("PDFData.pdf"))
{
string extractedText = pdfDocument.ExtractAllText();
Console.WriteLine(extractedText);
}
}
}
using IronPdf;
class Program
{
static void Main()
{
using (PdfDocument pdfDocument = PdfDocument.FromFile("PDFData.pdf"))
{
string extractedText = pdfDocument.ExtractAllText();
Console.WriteLine(extractedText);
}
}
}
Imports IronPdf
Friend Class Program
Shared Sub Main()
Using pdfDocument As PdfDocument = PdfDocument.FromFile("PDFData.pdf")
Dim extractedText As String = pdfDocument.ExtractAllText()
Console.WriteLine(extractedText)
End Using
End Sub
End Class
在这段代码中,我们使用 PdfDocument.FromFile
方法打开一个名为 "PDFData.pdf "的 PDF 文件。 该方法返回一个 PdfDocument 实例,我们将其封装在一个 using 语句中。
在 using 块中,我们在 PdfDocument 实例上调用 ExtractAllText
从 PDF 中提取所有文本。 当 using 块退出时,PdfDocument 会自动调用 Dispose 方法,释放其所持有的任何资源。
通过在 PdfDocument 中使用 using 语句,我们可以确保在提取完 PDF 文件中的文本后将其正确关闭,即使在此过程中出现了异常。 这是一个很好的例子,说明 using 语句如何帮助在 C# 中有效管理资源。
以上就是使用说明的简要介绍! 我们已经看到它是如何确保高效处理一次性对象,无缝管理一个或多个资源的。 using 语句不仅有助于保持代码的简洁,还能增强 C# 项目的可读性。
我们还介绍了 IronPdf,这是一个用于在 C# 中操作 PDF 的强大库。 结合 IronPdf 使用 using 语句展示了这一代码功能的实际应用,强化了这一概念及其重要性。
准备好使用 IronPDF了吗? 您可以从我们的30 天免费试用 IronPDF 和 Iron Software's Suite. 它还可以完全免费用于开发目的,因此您可以真正领略到它的魅力。 如果您喜欢,IronPDF 起价低至许可选项费用为 749 美元. 如需更多优惠,请查看Iron Suite 完整软件包在这里,您可以用两个工具的价格获得所有九个 Iron Software 工具。 快乐编程!