gpt4 book ai didi

f# - [] 有反义词吗?

转载 作者:行者123 更新时间:2023-12-02 06:52:40 24 4
gpt4 key购买 nike

这篇文章包含两个相互关联的问题,它们具有清理资源的共同点。我读过这个 SO post ,以及 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.

尽管我相信csvFileHcsvData被管理的资源,我想知道是否有 [<AutoOpen>] 的倒数是否需要一个?这将是一个允许图书馆释放在 [<AutoOpen>] 中创建的所有资源的指令。 .

我可以重组此代码以具有 using csvFileH周围,因为只需要读取 .csv 文件的句柄。但是给出一个 List<string[]> csvData type 返回,是否仍被视为托管资源,当应用程序关闭时将被垃圾处理。

最佳答案

所有这些[<AutoOpen>]确实是在没有 open 的情况下公开模块的内容陈述。就是这样。它不运行任何代码,它只是自动公开一些需要手动公开的内容。

在你的例子中,当你引用这个模块时,你实际上并没有执行任何事情。 initCsvLib是一个带有两个参数并返回 csvFileH 实例的纯函数.这里没有运行初始化代码。例如,如果你有

module Foo =
let expensiveThing = ExpensiveThing()

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

那么你手上可能就有问题了。在那种情况下,尽管您必须记住模块实际上是静态类并且基本上遵循与 C# 中的静态类相同的规则(考虑何时运行静态构造函数)并从那里开始。

但是如果你到了那个地步,你应该问问自己为什么首先要在构造函数中进行如此昂贵的操作......

关于f# - [<AutoOpen>] 有反义词吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39455737/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com