首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# using 陳述式:資源管理的最佳拍檔

     編輯:關於C語言

什麼是 using 陳述式?

using 關鍵字有兩種用法:

  1. 命名空間導入:using System.IO;
  2. 資源釋放區塊:using (var res = new Resource()) { ... } —— 本文主角。

核心機制:IDisposable 模式


public class Demo : IDisposable
{
    public void Dispose()
    {
        Console.WriteLine("Dispose 被呼叫,釋放非受控資源");
    }

    public void DoWork() => Console.WriteLine("執行工作");
}

using 區塊等價展開


// 寫法
using (var d = new Demo())
{
    d.DoWork();
}

// 編譯器展開為
Demo d = new Demo();
try
{
    d.DoWork();
}
finally
{
    if (d != null)
        ((IDisposable)d).Dispose(); // 保證釋放
}

實務範例:資料庫連線


// 傳統寫法:易忘記 Close,例外時洩漏
SqlConnection conn = new SqlConnection(connStr);
conn.Open();
// ...
conn.Close();

// using 寫法:自動釋放,例外安全
using (var conn = new SqlConnection(connStr))
{
    conn.Open();
    using (var cmd = new SqlCommand(sql, conn))
    using (var reader = cmd.ExecuteReader())
    {
        while (reader.Read()) { /* ... */ }
    }
} // 此處自動呼叫 conn.Dispose() -> Close()

多重資源巢狀 using


// C# 8+ 可簡化為單一 using 陳述式
using (var conn = new SqlConnection(connStr))
using (var cmd = new SqlCommand(sql, conn))
using (var reader = cmd.ExecuteReader())
{
    // ...
}

// 或更簡潔
using var conn = new SqlConnection(connStr);
using var cmd = new SqlCommand(sql, conn);
// 範圍結束自動 Dispose

常見可搭配 using 的類別

命名空間類別資源類型
System.IOStream, FileStream, StreamReader/Writer, BinaryReader/Writer檔案控制碼
System.DataSqlConnection, SqlCommand, SqlDataReader, DbTransaction資料庫連線、交易
System.NetHttpWebResponse, WebResponse, HttpClient (需 .NET Core 2.1+)網路連線
System.DrawingBitmap, Graphics, Pen, Brush, FontGDI+ 物件
System.ThreadingMutex, Semaphore, EventWaitHandle核心同步物件
System.Security.CryptographyHashAlgorithm, SymmetricAlgorithm, X509Certificate2加密控制碼

自訂類別實作 IDisposable 標準模式


public class ResourceHolder : IDisposable
{
    private IntPtr _handle; // 非受控資源
    private bool _disposed;

    public ResourceHolder()
    {
        _handle = NativeMethods.AcquireResource();
    }

    // 公開 Dispose
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this); // 告訴 GC 不需呼叫 Finalizer
    }

    // 核心邏輯:disposing=true 來自 Dispose(),false 來自 Finalizer
    protected virtual void Dispose(bool disposing)
    {
        if (_disposed) return;

        if (disposing)
        {
            // 釋放受控資源
        }

        // 釋放非受控資源
        if (_handle != IntPtr.Zero)
        {
            NativeMethods.ReleaseResource(_handle);
            _handle = IntPtr.Zero;
        }

        _disposed = true;
    }

    // Finalizer:防止使用者忘記 Dispose
    ~ResourceHolder()
    {
        Dispose(false);
    }
}

結語

using 陳述式是 C# 資源管理的基石,將 try/finally 模板化、強制化。凡實作 IDisposable 的物件,請無腦套用 using。這不只是編碼習慣,更是對系統資源負責的專業態度。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved