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