.NET 帮助

C# 使用(开发者如何运作)

发布 2024年八月15日
分享:

即使您刚刚接触 C#,您也可能已经接触过 using 指令。如果你是 IronPDF 的用户,你一定会对使用命名空间 "using ironpdf "来启动代码非常熟悉。

不过,using 关键字还有另一种用途。 在本指南中,我们将介绍 using 语句--它是什么、如何工作以及如何帮助您创建更高效的代码。 让我们深入了解!

什么是 C# 中的 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
VB   C#

在本例中,名为 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
VB   C#

有了 using 声明,您就不需要大括号或缩进,从而使您的代码更具可读性。 当变量离开作用域时,仍会自动调用 Dispose 方法。

Try 块、Finally 块和 Using 语句

您可能想知道 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
VB   C#

正如你所看到的,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
VB   C#

这两种方法都会确保在退出using块时对每个StreamReader对象调用Dispose方法,释放它们所占用的任何资源。

实现 IDisposable 接口

有时,您可能会创建自己的自定义类来管理一个或多个资源。 如果您的类负责处理一次性对象或非托管资源,则应实现 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
VB   C#

在本例中,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
VB   C#

当using块终止时,将调用Dispose方法,释放它所管理的StreamReader对象。

使用 Using 语句处理异常

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
VB   C#

在这种情况下,如果代码抛出 FileNotFoundException,异常会被 catch 块捕获并处理。 尽管异常发生在 using 块中,但仍会调用 StreamReader 对象的 Dispose 方法,以确保没有资源泄漏。

使用 IronPDF 和 Using Statement

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
VB   C#

在这段代码中,我们使用 PdfDocument.FromFile 方法打开一个名为 "PDFData.pdf "的 PDF 文件。 该方法返回一个 PdfDocument 实例,我们将其封装在一个 using 语句中。

在 using 块中,我们在 PdfDocument 实例上调用 ExtractAllText 从 PDF 中提取所有文本。 当 using 块退出时,PdfDocument 会自动调用 Dispose 方法,释放其所持有的任何资源。

通过在 PdfDocument 中使用 using 语句,我们可以确保在提取完 PDF 文件中的文本后将其正确关闭,即使在此过程中出现了异常。 这是一个很好的例子,说明 using 语句如何帮助在 C# 中有效管理资源。

Csharp Using 1 related to 使用 IronPDF 和 Using Statement

总结

以上就是使用说明的简要介绍! 我们已经看到它是如何确保高效处理一次性对象,无缝管理一个或多个资源的。 using 语句不仅有助于保持代码的简洁,还能增强 C# 项目的可读性。

我们还介绍了 IronPdf,这是一个用于在 C# 中操作 PDF 的强大库。 结合 IronPdf 使用 using 语句展示了这一代码功能的实际应用,强化了这一概念及其重要性。

准备好使用 IronPDF了吗? 您可以从我们的30 天免费试用 IronPDF 和 Iron Software's Suite. 它还可以完全免费用于开发目的,因此您可以真正领略到它的魅力。 如果您喜欢,IronPDF 起价低至许可选项费用为 749 美元. 如需更多优惠,请查看Iron Suite 完整软件包在这里,您可以用两个工具的价格获得所有九个 Iron Software 工具。 快乐编程!

Csharp Using 2 related to 总结

< 前一页
C#扩展方法(开发人员如何使用)
下一步 >
什么是 Visual C++ 可再发行组件

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

免费NuGet下载 总下载量: 11,781,565 查看许可证 >