您好,这是一个关于C#语言如何处理Com interop资源管理的示例。 原始来源:
Excel.Application app = null;
Excel.Workbooks books = null;
Excel.Workbook book = null;
Excel.Sheets sheets = null;
Excel.Worksheet sheet = null;
Excel.Range range = null;
try
{
app = new Excel.Application();
books = app.Workbooks;
book = books.Add();
sheets = book.Sheets;
sheet = sheets.Add();
range = sheet.Range["A1"];
range.Value = "Lorem Ipsum";
book.SaveAs(@"C:\Temp\ExcelBook" + DateTime.Now.Millisecond + ".xlsx");
book.Close();
app.Quit();
}
finally
{
if (range != null) Marshal.ReleaseComObject(range);
if (sheet != null) Marshal.ReleaseComObject(sheet);
if (sheets != null) Marshal.ReleaseComObject(sheets);
if (book != null) Marshal.ReleaseComObject(book);
if (books != null) Marshal.ReleaseComObject(books);
if (app != null) Marshal.ReleaseComObject(app);
}
我认为上面的代码是合理和必要的,但它不够实用或符合F#的方式。我最终在不同层次的try...finally和try...with中定义了所有这些com变量,并且由于变量必须在try块之前定义,因此清理代码存在于finally和with块中。这非常混乱。
如何在F#中正确地实现相同的功能?有点讽刺的是,互操作性在网上有很多示例,作为展示F#功能的一种方式。然而,它们都没有涉及如何管理com资源清理。
任何关于良好模式的建议都将不胜感激。
use
表达式。它类似于let
,但在对象超出范围时调用Dispose()。 - rmunn