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

C# 封裝檔案處理範本模式:分離變與不變代碼,簡化 Try-Catch-Finally

     編輯:關於.NET

痛點:重複的檔案處理樣板代碼

為確保檔案處理健壯性,常寫大量 try-catch-finally 確保關閉檔案流。真正業務邏輯可能僅幾行,卻被大量樣板代碼包圍,難以維護。

解決方案:Template Method + Delegate

將不變的流程(開啟、異常處理、關閉)封裝,將變化的業務邏輯以 Delegate 傳入。

1. 定義回調 Delegate

delegate void ProcessFileStreamCallback(FileStream file);

2. 靜態工具類 FileTemplate

public static class FileTemplate {
    public static void ProcessFile(string path, FileMode mode, FileAccess access, ProcessFileStreamCallback callback) {
        FileStream file = null;
        try {
            file = new FileStream(path, mode, access);
            callback(file);
        } catch (IOException e) { throw e; }
        finally {
            if (file != null) file.Close();
        }
    }
    public static void OpenFile(string path, FileAccess access, ProcessFileStreamCallback callback) {
        ProcessFile(path, FileMode.Open, access, callback);
    }
    public static void CreateFile(string path, ProcessFileStreamCallback callback) {
        ProcessFile(path, FileMode.CreateNew, FileAccess.Write, callback);
    }
}

3. 使用範例:寫入檔案

匿名方法:

FileTemplate.CreateFile(@"C:\text_test.txt", delegate(FileStream file) {
    using (StreamWriter sw = new StreamWriter(file)) {
        sw.Write(text);
        sw.Flush(); // 手動 Flush 因未 Close StreamWriter
        Console.WriteLine("資料已寫入。");
    }
});

Lambda 表達式:

FileTemplate.CreateFile(@"C:\text_test.txt", fs => {
    using (StreamWriter sw = new StreamWriter(fs)) {
        sw.Write(text);
        sw.Flush();
        Console.WriteLine("資料已寫入。");
    }
});

進階與說明

  • 異常處理可再封裝 Delegate 讓調用者自訂
  • 此法源自 Java Spring 的 Template 模式,C# Delegate 使實作更輕量
  • 亦可用 Template Method Pattern (繼承) 實現,但 Delegate 更靈活
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved