在C#中,我可以声明未初始化的变量,然后在类的各种方法中分配这些变量。例如,在NUnit测试中,我可以声明一个仅在设置方法中初始化的类型变量,然后在各种测试中重复使用。
private MyTestClass sut;
public Setup()
{
sut = new MyTestClass();
etc.
}
public FirstTest()
{
sut.DoSomeWork(1);
}
public SecondTest()
{
sut.DoSomeWork(2);
}
我想在F#中做相同的事情。但是根据this和其他人的说法,未分配的'变量'并不是F#中的完成。
对于我的F#测试,测试不是在任何类型中,只是在模块内,因此[<DefaultValue>] val
将无效。
使用mutable
感觉不对,因为这似乎是F#编码员的最后选择。
由于idomatic F#不应该需要未分配的值,解决这个问题的“正确”方法是什么?
答案 0 :(得分:5)
您可以使用功能和值。无需声明未分配的变量。
let makeTestClass() =
MyTestClass()
// etc.
let ``First test``() =
let sut = makeTestClass()
sut.DoSomeWork()
let ``Second test``() =
let sut = makeTestClass()
sut.DoSomeWork()
答案 1 :(得分:1)
您可以使用lazy
:
let sut = lazy (new MyTestClass())
lazy
推迟表达式的执行,直到需要结果为止。对延迟值的后续请求不需要重新计算,它只是返回上次存储的结果。
然后你可以这样做:
let ``First test``() =
sut.Force().DoSomeWork(1)
let ``Second test``() =
sut.Force().DoSomeWork(2)
如果初始化很昂贵并且您不想重复它,这可能是合适的。