什么是惯用的 F# 等同于声明一个变量供以后在 C# 中使用

What is the idiomatic F# equivalent to declaring a variable for later use in C#

在 C# 中,我可以声明未初始化的变量,这些变量稍后会在 class 的各种方法中赋值。例如,在 NUnit 测试中,我可以声明一个类型化变量,该变量仅在设置方法中初始化,然后在各种测试中重复使用。

private MyTestClass sut;

public Setup()
{
    sut = new MyTestClass();
    etc.
}

public FirstTest()
{
    sut.DoSomeWork(1); 
}

public SecondTest()
{
    sut.DoSomeWork(2);
}

我想在 F# 中做同样的事情。然而,根据 this 和其他人的说法,未分配的 'variables' 并不是 F# 中完成的事情。

就我的 F# 测试而言,测试不在任何类型中,只是在一个模块中,因此 [<DefaultValue>] val 将不起作用。 使用 mutable 感觉不对,因为这似乎是 F# 编码人员的最后选择。

既然 idomatic F# 不应该需要未分配的值,那么 "correct" 解决这个问题的方法是什么?

您可以使用函数和值。无需声明未赋值的变量。

let makeTestClass() =
    MyTestClass()
    // etc.

let ``First test``() =
    let sut = makeTestClass()
    sut.DoSomeWork()

let ``Second test``() =
    let sut = makeTestClass()
    sut.DoSomeWork()

您可以使用 lazy:

let sut = lazy (new MyTestClass())

lazy 推迟表达式的执行,直到需要结果为止。对惰性值的后续请求不需要重新计算它,它只是 returns 上次的存储结果。

那么你可以这样做:

let ``First test``() =
    sut.Force().DoSomeWork(1)

let ``Second test``() =
    sut.Force().DoSomeWork(2)

如果初始化成本高且您不想重复,这可能是合适的。