Syntax 我可以用“吗?”;模糊的;使用IDisposable对象传递参数?

Syntax 我可以用“吗?”;模糊的;使用IDisposable对象传递参数?,syntax,f#,parameter-passing,idisposable,Syntax,F#,Parameter Passing,Idisposable,下面是我创建的一个简单的代码片段,以理解为什么我在代码中要在操作之前进行dispose type IType = inherit IDisposable abstract say : string -> unit let St = { new IType with member i.say hi = Console.Write hi member i.Dispose() = Console.Write "So I dis

下面是我创建的一个简单的代码片段,以理解为什么我在代码中要在操作之前进行dispose

type IType = 
    inherit IDisposable
    abstract say : string -> unit

let St = {
    new IType with
        member i.say hi     = Console.Write hi
        member i.Dispose()  = Console.Write "So I disposed"
    }

let Say1(cmon : IType) =
    using   <| cmon
            <| fun lol -> lol.say

Say1 St " :( " // So I disposed :(

printfn ""

let Say2(cmon : IType) (smile : string) =
    using   <| cmon
            <| fun lol -> lol.say smile

Say2 St " :) " // :) So I disposed
类型IType=
可继承的
摘要:字符串->单位
设St={
新的IType带有
成员i.say hi=Console.Write hi
成员i.Dispose()=控制台。编写“因此我已处理”
}
让我们说1(cmon:IType)=

一旦相应的
SayN
退出,就会调用usingDispose

在第一种情况下,函数退出(因此调用dispose)并返回类型为
string->()
的函数,然后执行该函数并打印其结果

在第二种情况下,打印结果,然后函数退出(因此在将字符串打印到控制台后调用Dispose)

我想说的是,最好的解决方案是使用DU作为参数-因此您可以定义

type t = |N |S of string ... //for all possible cases

然后你就让你的函数取一个类型为
t

DU的参数作为参数?我不完全明白。请您提供一些与示例相关的示例。因此,您的Say变为
let Say2(cmon:Itype)(arg:t)=使用t.Say s//此处的其他案例
。另外,您的语法有点奇怪,我使用的许多
控制台。例如编写
(arg:t)
仍然是一个参数。如果我想传递100个参数呢?那么您的一个DU案例是100个参数的
| Long of int*int*..
,这有点难看,但在这种情况下,您最好使用数组。我的意思是类似于printf样式的参数,我想写
Log“here%s%s”“lot”“of”“parameters”
看看你的最后几个问题,它们似乎有一个共同的主题。你到底想做什么?我想使用类似printf的语法来登录到文件。我正试图为它找到一个优雅的解决方案。那么为什么你不能使用fprintf呢?我使用它,但我想把它包装成IDisposable对象来处理
StreamWriter
,正如这里给我的建议:但问题是我需要使用PrintfArgs->()函数