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)
即使我相信csvFileH并csvData成为管理资源,我也想知道是否存在相反的情况[<AutoOpen>],是否需要存在一个?这将是一个允许库释放创建的所有资源的指令[<AutoOpen>].
我可以重组这段代码有using周围的csvFileH,因为处理该只在.csv文件中读取需要的.但是,如果List<string[]> csvData返回了一个类型,那么它仍然被认为是一个托管资源,当应用程序关闭时它将被垃圾处理掉.
所有这一切[<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#中静态类相同的规则(考虑何时运行静态构造函数)并从那里开始.
但是,如果你达到这一点,你应该首先问问自己为什么你在构造函数中有这么昂贵的操作......