F# 什么时候是模块级;常数;正在F中初始化的数组#
这个问题是在我试图编写查找表时出现的,在调试期间,我有一个印象,数组可能不是在编译或加载时初始化的,而是以一种懒惰的方式初始化的。。。不幸的是,我在MSDN关于阵列的章节中找不到答案 让我们先看一些示例代码。顺便说一句,代码在已编译的应用程序中,而不是脚本中F# 什么时候是模块级;常数;正在F中初始化的数组#,f#,F#,这个问题是在我试图编写查找表时出现的,在调试期间,我有一个印象,数组可能不是在编译或加载时初始化的,而是以一种懒惰的方式初始化的。。。不幸的是,我在MSDN关于阵列的章节中找不到答案 让我们先看一些示例代码。顺便说一句,代码在已编译的应用程序中,而不是脚本中 module Foo = let bar = [| for i in 0..9 -> yield (i*i) |] Foo.bar何时初始化 在编译时 装载时 懒惰,第一次访问时 从来没有?(尽管其数组类型不同,仍然是基
module Foo =
let bar = [| for i in 0..9 -> yield (i*i) |]
Foo.bar
何时初始化
是否存在以不同方式处理的情况,如普通与复杂的ePression或长数组与短数组等?
Foo.bar
在加载时或应用程序启动时初始化
对于库和应用程序来说,这两者的实现方式略有不同。对于应用程序,编译器将适当的初始化插入到Main
方法中。对于库,初始化检查被插入到(我相信)所有类型的静态构造函数中,因此当您从库访问任何类型时,初始化就完成了(这可能是在Main
之后的某个时间,但仍然是在您从库运行任何代码之前)
它实际上并不取决于代码是什么-如果它是一个值,它将被初始化。有些值,如
Lazy
或IEnumerable
,虽然不能立即完全计算,但该值还是被初始化了。我想知道的原因是,如果我在序列表达式中放置断点,它不会在启动时被命中,而是在我访问数组时被命中。这是几天前,当我在我的代码中寻找另一个问题时-我将不得不复制。。。但这正是引发我问的原因。@BitTickler如果您使用seq{…}
而不是[|…}]
,那么情况肯定会是这样,因为这样会创建一个惰性IEnumerable
数组,而不是完全初始化的数组。