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

[你必須知道的.NET]第十六回:深入淺出關鍵字——using 全接觸

     編輯:關於.NET

本文介紹內容

  • using 指令的多種用法
  • using 敘述在 Dispose 模式中的應用

1. 引言

.NET 關鍵字常身兼數職。如 new 除建立物件,在繼承體系隱藏基類別成員、泛型宣告約束型別參數(詳見第五回)。本文聚焦另一明星關鍵字 using,詳細討論其多重身份,了解 .NET 語言機制的簡便與深邃。

using 的多重身份:

  • 引入命名空間
  • 建立別名
  • 強制資源清理

2. 引入命名空間

用法:using Namespace;

最常見:using System; 封裝基本常用操作。引入後可直接使用命名空間型別,無需指定完整名稱。可存取巢狀命名空間。

關於命名空間

邏輯組織結構,非物理結構,避免類別名稱衝突,組合劃分資料型別。基本型別在 System,資料操作在 System.Data。

迷思釐清

  • using 類似 Java import,引入邏輯結構;不同於 C #include 引入實際類別庫。
  • using 引入命名空間 ≠ 編譯器載入該命名空間所在組件。組件載入取決於程式碼是否存在調用操作。若無調用,編譯器忽略該組件。因此源檔開頭引入多個命名空間 ≠ 載入多個組件,不會造成「過度引用」弊端。

3. 建立別名

用法:using alias = namespace | type;

  • namespace:建立命名空間別名
  • type:建立型別別名

範例:Office 互操作

using MSWord = Microsoft.Office.Interop.Word;
private static MSWord.Application ooo = new MSWord.Application();

型別別名

using MyConsole = System.Console;
class UsingEx {
    public static void Main() { MyConsole.WriteLine("應用了類別別名。"); }
}

解決命名衝突

同一 cs 檔引入不同命名空間含相同名稱型別時,設定別名解決:

比完整型別名稱更符合編碼規範。

4. 強制資源清理

4.1 由來:Dispose 模式

理解 using 強制清理資源,先了解 Dispose 模式,再了解 .NET 垃圾回收機制。.NET 提供 Dispose 模式實現顯式釋放與關閉物件能力。

Dispose 模式:顯式清理物件資源的約定方式,用於釋放物件封裝的非受控資源。非受控資源不受 GC 控制,物件必須調用自身 Dispose() 釋放。概念上是約定,實現上是讓型別實作 IDisposable 介面,提供公有 Dispose 方法。

4.2 實質:try-finally

using 敘述提供強制清理資源的便捷操作,指定何時釋放資源。典型應用:

using (Font f = new Font("Verdana", 12, FontStyle.Regular))
{
    Graphics g = e.Graphics;
    Rectangle rect = new Rectangle(10, 10, 200, 200);
    g.DrawString("Try finally dispose font.", f, Brushes.Black, rect);
} // 結束時自動呼叫 f.Dispose()

Font 實作 IDisposable:

public sealed class Font : MarshalByRefObject, ICloneable, ISerializable, IDisposable

IL 揭密

編譯器自動將 using 轉為 try-finally,在 finally 區塊呼叫 Dispose():

.method public hidebysig static void Main() cil managed
{
    .entrypoint
    .maxstack 4
    .locals init ([0] class [System.Drawing]System.Drawing.Font f, [1] bool CS$4$0000)
    IL_0000: nop
    IL_0001: ldstr "Verdana"
    ...
    .try { ... } finally {
        IL_001f: callvirt instance void [mscorlib]System.IDisposable::Dispose()
        IL_0024: nop
        IL_0025: endfinally
    }
    IL_0026: nop
    IL_0027: ret
}

等效代碼:

Font f2 = new Font("Arial", 10, FontStyle.Bold);
try {
    // 繪圖操作
} finally {
    if (f2 != null) ((IDisposable)f2).Dispose();
}

4.3 規則

  • using 僅用於實作 IDisposable 的型別,否則編譯錯誤。
  • 適用於清理單一非受控資源;多物件清理宜用 try-finally,巢狀 using 可能有隱藏 Bug(內層拋異常時外層資源無法釋放)。
  • 支援初始化多個變數,但型別必須相同:using(Pen p1 = new Pen(Brushes.Black), p2 = new Pen(Brushes.Blue))。不同型別可用 IDisposable 統一或 try-finally。
  • Dispose 清理非受控資源,非釋放物件記憶體(記憶體仍由 GC 控制)。
  • 達到 using 末尾退出;異常可能提前退出。
  • 物件可在 using 前宣告:Font f3 = new Font(...); using (f3) { ... }

5. 結論

一個簡單關鍵字,多種不同應用場合。本文從全面角度詮釋 using 在 .NET 中的多種用法(主要限 C#)。

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