我有一个F#DLL和一个C#DLL.
C#库有一个名称空间Library,其类Toolbox包含如下所示的成员FUND_BITS:
namespace Library {
public static class Toolbox {
public static uint FUND_BITS = 0;
}
}
Run Code Online (Sandbox Code Playgroud)
然后在F#库中我有一个绑定:
let bf = Library.Toolbox.FUND_BITS
Run Code Online (Sandbox Code Playgroud)
现在,我使用bf了库中定义的几个函数.当我改变值时FUND_BITS,我希望所有的F#函数都会使用更新的值,因为我已经绑定bf引用Library.Toolbox.FUND_BITS,并且没有声明它是一个可变副本或任何东西.但是,我发现这些函数使用的是过时值FUND_BITS而不是更新后的值.
我是否误解了F#如何创建不可变的值绑定?如果是这样,我无法找到以更新方式绑定的方法,例如:
let bf = &Library.Toolbox.FUND_BITS
Run Code Online (Sandbox Code Playgroud)
不幸的是,在这种情况下,"绑定"与用户界面数据绑定意义上的"绑定"不同.该行let bf = Library.Toolbox.FUND_BITS基本上是一个简单的赋值语句.您会发现类型推断显示该值bf是一个实例uint32.
如果要动态读取值,则需要使用每次调用时读取静态变量值的函数.
let bf = (function () -> Library.Toolbox.FUND_BITS)
Run Code Online (Sandbox Code Playgroud)
编辑这个更简洁的版本是由于Guvante
let bf() = Library.Toobox.FUND_BITS
Run Code Online (Sandbox Code Playgroud)
在这种情况下,bf将有一种类型unit -> uint32.
如果你想在值之间建立双向链接,那么你可以声明一个使用静态字段作为后备存储的属性getter和setter,但这只会吓到我.更好的方法是在需要读取或写入时直接引用该字段.