.NET 幫助

C# 使用 (對開發者的運作方式)

發佈 2024年8月15日
分享:

即使您剛開始學習 C#,也可能已經接觸過 using 指令。如果您是 IronPDF 的用戶,您會非常熟悉用命名空間 using ironpdf 開始您的程式碼。

然而,using 關鍵字還有另一個用法。 在本指南中,我們將介紹 using 語句——它是什麼、如何運作,以及如何幫助您創建更高效的代碼。 讓我們開始吧!

什麼是 C# 中的 Using?

在 C# 中,using 語句是一種方便的方式,用於處理實現 IDisposable 介面的資源。 IDisposable 物件通常持有非受控資源,例如檔案控制碼或網路連接,這些資源在使用完畢後需要釋放。 這就是 using 語句派上用場的地方——它幫助您確保在使用後正確地處理這些資源。

使用語句的工作原理

當您使用 using 陳述式時,C# 將在物件不再需要時自動調用該物件的 Dispose 方法。 這意味著您不必手動呼叫 Dispose 方法,也不必擔心忘記這樣做。 using 語句會為您處理這一點。!

讓我們來看看一個簡單的例子,了解使用 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 區塊時,會自動呼叫 reader 的 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 Block、Finally Block 和 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 陳述式的優點之一是它可以同時處理多個資源。 您可以將 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語句。

以下是如何在 CustomResource 類別中使用 using 語句:

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#

當使用區塊終止時,將調用 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
VB   C#

在此情況下,如果代碼拋出 FileNotFoundException,則該異常將由 catch 區塊捕獲並處理。 即使異常發生在 using 區塊內,StreamReader 物件的 Dispose 方法仍然會被調用,以確保不會有資源洩漏。

使用 IronPDF 和 Using 陳述式进行工作

IronPDF 是一個受歡迎的庫,用於在 C# 和 .NET 應用中創建、編輯和提取 PDF 文件。 像其他使用資源的庫一樣,IronPDF 也可以利用 using 語句來確保適當的資源管理。

讓我們探索如何使用 using 語句與 IronPDF 從 HTML 字串創建 PDF 文件,展示 using 語句在實際場景中的強大功能。

首先,確保已在專案中安裝了 IronPDF NuGet 套件:

Install-Package 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 區塊內,我們對 PdfDocument 實例呼叫 ExtractAllText 以提取 PDF 中的所有文字。 當離開 using 區塊時,會自動調用 PdfDocument 的 Dispose 方法,釋放其所持有的任何資源。

通過在 PdfDocument 中使用 using 語句,即使在過程中發生異常,我們也能確保在完成提取文本後正確地關閉 PDF 文件。 這是一個很好的例子,說明如何使用 using 語句來有效管理 C# 中的資源。

Csharp Using 1 related to 使用 IronPDF 和 Using 陳述式进行工作

總結

這就是使用宣告的簡要概述。! 我們已經看到了它如何確保一次性物件的有效處理,無縫管理一個或多個資源。 using 語句不僅有助於維持更乾淨的代碼,還能提高 C# 項目的可讀性。

我們還引入了IronPDF,一個用於C#的強大PDF操作庫。 將 using 語句與 IronPDF 結合使用展示了該程式碼功能的實際應用,加強了這一概念及其重要性。

準備好動手使用IronPDF了嗎? 您可以從我們的IronPDF 和 Iron Software 套件的30天免費試用. 它也可完全免費用於開發目的,因此您可以真正了解它的組成。 如果您喜歡所見內容,IronPDF 的起價僅為$749 授權選項. 如需更多節省,請查看Iron Suite 完整軟體包只需兩個產品的價格,你就能獲得全部九個Iron Software工具。 編碼快樂!

Csharp Using 2 related to 總結

< 上一頁
C# 擴充方法(開發人員如何使用)
下一個 >
Visual C++ 可再发行程序包是什麼

準備開始了嗎? 版本: 2024.11 剛剛發布

免費 NuGet 下載 總下載次數: 11,493,407 查看許可證 >