こんにちは、これはC#言語がCom interopリソース管理をどのように処理するかの例です。 orginal source:F#でリソースを処理する機能的な方法
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);
}
は個人的に私は上記のコードは、合理的かつ必要だと思います。しかし、それは機能的ではありません。私はこれらのcom変数を、try ... finally ...とtry ... ...の異なるレベルで定義してしまいました。そしてtryブロックの前に変数を定義しなければならないので、finallyコードとwithブロックの両方にクリーンアップコードが存在します。それは非常に面倒です。
F#で同じことを正しく実装できますか?その少し皮肉なことに、F#を実証する方法として、interopでF#を使用する方法を説明しているインターネット上の多くの例があります。しかし、誰もcomリソースのクリーンアップを管理する方法については話しません。
良いパターンに関するアドバイスがあります。
私の携帯電話は、IDisposableオブジェクト(またはComがIDisposableを実装していない場合はラッパー)を使用し、F#の 'use'式を使用しているので、簡単に問題を解決できます。 。オブジェクトがスコープ外に出たときにDispose()を呼び出す点を除いて 'let'と似ています。 – rmunn