2

この投稿には、リソースのクリーンアップに共通する相互に関連する 2 つの質問が含まれています。私はこの SO の投稿を読み、Microsoft のサイトで管理されているリソースと管理されていないリソースを判断しようとしている他のいくつかの投稿と一緒に読みました。私が読んだことに基づいて、次のコード ブロックは .Net マネージ リソースを使用します。これは非 DLL F# ライブラリからのものです。

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.

csvFileH私は管理されたリソースであると信じていcsvDataますが、その逆があるのでは[<AutoOpen>]ないかと考えていました。これは、ライブラリが で作成されたすべてのリソースを解放できるようにするディレクティブです[<AutoOpen>]

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

4

1 に答える 1

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# で行うのと同じ規則に従い (静的コンストラクターがいつ実行されるかを考えて)、そこから進む必要があることを思い出してください。

しかし、その点に到達した場合は、そもそもなぜコンストラクターでこのような高価な操作を行うのかを自問する必要があります...

于 2016-09-12T17:46:54.193 に答える