f# - 模块级 "constant"数组何时在 F# 中初始化

标签 f#

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

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

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

Foo.bar何时初始化?

  1. 在编译时?
  2. 加载时?
  3. 第一次访问时比较懒?
  4. 从来没有? (尽管它是数组类型,但仍然是基于 IEnumerator 的序列?)

顺便说一句,我的序列表达式比上面的示例更复杂,并且还使用了范围内的其他函数。

是否存在以不同方式处理的情况,例如简单表达与复杂表达或长数组与短数组等?

最佳答案

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

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

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

关于f# - 模块级 "constant"数组何时在 F# 中初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47824390/

相关文章:

f# - 如何解析 FParsec 中的递归语法

F# - 损坏 "then"

f# - $ 运算符做什么?

F# BinarySearch 返回位置

math - 有 F# 的数学库吗?

F#如何从-1到1或1到-1循环?

f# - 使用带有 redis 服务堆栈库的 f# 类的奇怪行为

f# - 滥用模式匹配

.net - 那么,既然 F# 已经开源,那么它又是怎么回事呢?

http - 从 C# 移植到 F# 时出现 System.Net.WebException