示例:
let inline ReadState() =
let rec f (w : SpinWait) =
if (...) then
w.SpinOnce()
f(w)
else
result
f (new SpinWait())使用ILSpy时,我注意到每次调用ReadState()都会创建FSharpFunc的新实例
new Memory@f222().Invoke() // Memory@f222 implement FSharpFunc如何避免呢?
如果是f not inner fun,那么no instance created,但是我需要另一个命名函数:
let rec InternalReadState(w : SpinWait) = ....
let ReadState() = InternalReadState(new SpinWait())不太美:
发布于 2013-12-16 15:47:02
在我看来,你有一些选择,但你可能对其中任何一个都不满意。最简单的方法是删除inline,然后将()参数移到嵌套函数之后:
let ReadState =
let rec f (w : SpinWait) =
if (...) then
w.SpinOnce()
f(w)
else
result
fun () -> f (new SpinWait())您需要在这里删除inline,因为它只能应用于语法函数。
您的另一个选择是创建另一个命名函数,正如您注意到的那样。如果您担心不必要的命名函数会污染您的作用域,那么可以选择一些方法来减轻这种情况。您可以使用签名文件仅公开ReadState函数,也可以使用private修饰符使其在您所在范围之外的私有范围内:
module MyStuff =
let rec private f (w:SpinWait) = ...
let inline ReadState() = f (new SpinWait())https://stackoverflow.com/questions/20603696
复制相似问题