在實際環境中測試
在生產環境中測試無浮水印。
在任何需要的地方都能運作。
即使您剛開始學習 C#,也可能已經接觸過 using 指令。如果您是 IronPDF 的用戶,您會非常熟悉用命名空間 using ironpdf
開始您的程式碼。
然而,using 關鍵字還有另一個用法。 在本指南中,我們將介紹 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
在此範例中,名為 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
使用 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 陳述式的優點之一是它可以同時處理多個資源。 您可以將 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語句。
以下是如何在 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
當使用區塊終止時,將調用 Dispose 方法,處理它管理的 StreamReader 物件。
使用 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 語句來確保適當的資源管理。
讓我們探索如何使用 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
在此程式碼中,我們使用 PdfDocument.FromFile
方法開啟名為 "PDFData.pdf" 的 PDF 檔案。 此方法返回一個 PdfDocument 實例,我們將其包裝在使用語句中。
在 using 區塊內,我們對 PdfDocument 實例呼叫 ExtractAllText
以提取 PDF 中的所有文字。 當離開 using 區塊時,會自動調用 PdfDocument 的 Dispose 方法,釋放其所持有的任何資源。
通過在 PdfDocument 中使用 using 語句,即使在過程中發生異常,我們也能確保在完成提取文本後正確地關閉 PDF 文件。 這是一個很好的例子,說明如何使用 using 語句來有效管理 C# 中的資源。
這就是使用宣告的簡要概述。! 我們已經看到了它如何確保一次性物件的有效處理,無縫管理一個或多個資源。 using
語句不僅有助於維持更乾淨的代碼,還能提高 C# 項目的可讀性。
我們還引入了IronPDF,一個用於C#的強大PDF操作庫。 將 using 語句與 IronPDF 結合使用展示了該程式碼功能的實際應用,加強了這一概念及其重要性。
準備好動手使用IronPDF了嗎? 您可以從我們的IronPDF 和 Iron Software 套件的30天免費試用. 它也可完全免費用於開發目的,因此您可以真正了解它的組成。 如果您喜歡所見內容,IronPDF 的起價僅為$749 授權選項. 如需更多節省,請查看Iron Suite 完整軟體包只需兩個產品的價格,你就能獲得全部九個Iron Software工具。 編碼快樂!