F# 什么时候是模块级;常数;正在F中初始化的数组#

F# 什么时候是模块级;常数;正在F中初始化的数组#,f#,F#,这个问题是在我试图编写查找表时出现的,在调试期间,我有一个印象,数组可能不是在编译或加载时初始化的,而是以一种懒惰的方式初始化的。。。不幸的是,我在MSDN关于阵列的章节中找不到答案 让我们先看一些示例代码。顺便说一句,代码在已编译的应用程序中,而不是脚本中 module Foo = let bar = [| for i in 0..9 -> yield (i*i) |] Foo.bar何时初始化 在编译时 装载时 懒惰,第一次访问时 从来没有?(尽管其数组类型不同,仍然是基

这个问题是在我试图编写查找表时出现的,在调试期间,我有一个印象,数组可能不是在编译或加载时初始化的,而是以一种懒惰的方式初始化的。。。不幸的是,我在MSDN关于阵列的章节中找不到答案

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

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

  • 在编译时
  • 装载时
  • 懒惰,第一次访问时
  • 从来没有?(尽管其数组类型不同,仍然是基于IEnumerator的序列?)
  • 另一方面,我的序列表达式比上面的示例更复杂,并且还使用范围内的其他函数


    是否存在以不同方式处理的情况,如普通与复杂的ePression或长数组与短数组等?

    Foo.bar
    在加载时或应用程序启动时初始化

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


    它实际上并不取决于代码是什么-如果它是一个值,它将被初始化。有些值,如
    Lazy
    IEnumerable
    ,虽然不能立即完全计算,但该值还是被初始化了。

    我想知道的原因是,如果我在序列表达式中放置断点,它不会在启动时被命中,而是在我访问数组时被命中。这是几天前,当我在我的代码中寻找另一个问题时-我将不得不复制。。。但这正是引发我问的原因。@BitTickler如果您使用
    seq{…}
    而不是
    [|…}]
    ,那么情况肯定会是这样,因为这样会创建一个惰性
    IEnumerable
    数组,而不是完全初始化的数组。