2016-09-12 7 views
2

この投稿には、共通のリソースをクリーンアップしている2つの相互関連の質問が含まれています。私はSO postと、管理対象リソースとアンマネージドリソースを判別しようとしているMicrosoftのサイトの他のいくつかと一緒に読んでいます。私が読んだことに基づいて、以下のコードブロックは.Net管理リソースを使用します。これはDLL以外のF#ライブラリからのものです。[<AutoOpen>]の逆数はありますか?

namespace Toa.csv_lib 
open System 
open System.Threading 
open System.Collections.Generic 
open System.Linq 
open System.Text 
open System.Threading.Tasks 
open System.IO 
open Microsoft.VisualBasic.FileIO 

[<AutoOpen>] 
module csv_lib = 
    let initCsvLib fn delim = 
     let csvFileH = new TextFieldParser(fn:string) 
     csvFileH.TextFieldType = FieldType.Delimited |> ignore 
     csvFileH.SetDelimiters(delim) |> ignore 
     csvFileH 

    let readCsvLibLine csvFileH = 
     (csvFileH:TextFieldParser).ReadFields() 

    let retCsvData csvFileH = 
     let csvData = new List<string[]>() 

     if not (csvFileH:TextFieldParser).EndOfData then 
      let column_headings = readCsvLibLine csvFileH 
      csvData.Add(column_headings) |> ignore 

      let read_rest_of_csv() = 
       csvData.Add(readCsvLibLine csvFileH) |> ignore 
       not (csvFileH:TextFieldParser).EndOfData 

      while read_rest_of_csv() do ignore None 
     csvData // Last expression is returned. 

私が管理するcsvFileHcsvDataリソースを信じていますが、私が思っていたが[<AutoOpen>]にそこは逆であり、1があるように必要なのですか?これは、図書館が[<AutoOpen>]で作成されたすべてのリソースを解放することを許可する指令です。

csvFileHの前後にこのコードをusingに再構成することができます。このハンドルは、.csvファイルの読み取りにのみ必要であるためです。しかし、List<string[]> csvData型が返された場合、それはアプリケーションがシャットダウンしたときにガベージ処理される管理対象リソースと見なされます。

+5

あなたは明確にどのような '[]'手段を誤解。 –

答えて

8

すべて[<AutoOpen>]は、openステートメントのないモジュールの内容を公開しています。それでおしまい。それはコードを実行していない、手動で公開する必要があるものを自動的に公開するだけです。

このモジュールを参照しているときには、実際には何も実行していません。 initCsvLibは、2つの引数をとり、csvFileHのインスタンスを返す純粋な関数です。ここで実行されている初期化コードはありません。たとえば、持っていた場合

module Foo = 
    let expensiveThing = ExpensiveThing() 

    let myFn arg1 arg2 = 
     // This isn't run until the function myFn is called. 
     let expensiveThing = ExpensiveThing() 
     // ... 

あなたが問題を抱えている可能性があります。その場合、モジュールは実際に静的なクラスであり、基本的にC#で静的なクラスと同じ規則に従います(静的なコンストラクタの実行時を考えて)。

しかし、あなたはその時点までに取得する場合、あなたが最初の場所で、コンストラクタで、このような高価な操作を持っているなぜあなたは代わりに自分自身に尋ねるべきである...

+2

すべてが真です。 '[]'の逆は '[RequireQualifiedAccess]]'です。最初は "ModuleNameを開く"必要がないことを意味し、2番目は "ModuleNameを開く"ことができないことを意味します。 –

関連する問題