何时模块级“常量”数组在F#中初始化

时间:2017-12-15 01:03:32

标签: f#

当我尝试编写查找表时出现了问题,在调试过程中我得到的印象是,数组可能不会在编译或加载时初始化,而是以懒惰的方式初始化...不幸的是我不能在MSDN章节中找到关于数组的答案。

让我们先看看一些示例代码。代码在编译的应用程序中,而不是脚本,顺便说一句。

module Foo = 
    let bar = [| for i in 0..9 -> yield (i*i) |] 

Foo.bar何时初始化?

  1. 在编译时?
  2. 在加载时间?
  3. 懒惰,第一次访问时?
  4. 从不? (尽管它的数组类型是基于IEnumerator的序列?)
  5. 另一方面,我的序列表达式比上面的例子更复杂,并且还使用了范围内的其他函数。

    是否存在以不同方式处理的情况,例如平凡与复杂的eypression或长与短阵列等?

1 个答案:

答案 0 :(得分:4)

Foo.bar在加载时初始化 - 或者,当您的应用程序启动时。

对库和应用程序的处理方式略有不同。对于应用程序,编译器会在Main方法中插入适当的初始化。对于库,初始化检查被插入到(我相信)所有类型的静态构造函数中,因此当您从库中访问任何类型时,初始化完成(这可能在Main之后的某个时间,但仍然在您运行之前来自图书馆的任何代码。)

它实际上并不取决于代码是什么 - 如果它是一个值,它将被初始化。有些值如Lazy<T>IEnumerable<T>没有立即完全评估,但值仍会初始化。