是否与[<AutoOpen>]相反?

oct*_*bus 2 f# unmanagedresources

这篇文章包含两个相互关联的问题,这些问题共同清理了资源.我已经阅读了这篇SO 帖子,以及微软网站上的其他几篇文章,试图确定什么是托管资源和非托管资源.根据我读到的内容,以下代码块使用.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.
Run Code Online (Sandbox Code Playgroud)

即使我相信csvFileHcsvData成为管理资源,我也想知道是否存在相反的情况[<AutoOpen>],是否需要存在一个?这将是一个允许库释放创建的所有资源的指令[<AutoOpen>].

我可以重组这段代码有using周围的csvFileH,因为处理该只在.csv文件中读取需要的.但是,如果List<string[]> csvData返回了一个类型,那么它仍然被认为是一个托管资源,当应用程序关闭时它将被垃圾处理掉.

Lev*_*lho 8

所有这一切[<AutoOpen>]都是在没有open语句的情况下公开模块的内容.而已.它没有运行任何代码,它只是自动暴露一些需要手动曝光的东西.

在你的情况下,虽然当你引用这个模块时,你实际上并没有执行任何操作.initCsvLib是一个纯函数,它接受两个args并返回一个实例csvFileH.这里没有运行初始化代码.如果你有例如

module Foo =
    let expensiveThing = ExpensiveThing()

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

那你可能手上有问题.在这种情况下,虽然您必须回忆起模块实际上是静态类,并且基本遵循与C#中静态类相同的规则(考虑何时运行静态构造函数)并从那里开始.

但是,如果你达到这一点,你应该首先问问自己为什么你在构造函数中有这么昂贵的操作......

  • 一切都是如此.`[<AutoOpen>]`的倒数是`[<RequireQualifiedAccess>]`.第一个意味着您不必"打开ModuleName",第二个意味着您无法"打开ModuleName". (2认同)