為確保檔案處理健壯性,常寫大量 try-catch-finally 確保關閉檔案流。真正業務邏輯可能僅幾行,卻被大量樣板代碼包圍,難以維護。
將不變的流程(開啟、異常處理、關閉)封裝,將變化的業務邏輯以 Delegate 傳入。
delegate void ProcessFileStreamCallback(FileStream file);
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);
}
}
匿名方法:
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("資料已寫入。");
}
});