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

时间:2017-10-20 13:21:22

标签: f# immutability

在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#不应该需要未分配的值,解决这个问题的“正确”方法是什么?

2 个答案:

答案 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)

如果初始化很昂贵并且您不想重复它,这可能是合适的。