在浏览StackOverflow时,我偶然发现了以下答案:
https://stackoverflow.com/a/3817367/162694
// ... removed unneeded code
/// This type is intended for private use within Singleton only.
type private SyncRoot = class end
type Singleton =
[<DefaultValue>]
static val mutable private instance: Singleton
private new() = { }
static member Instance =
lock typeof<SyncRoot> (fun() ->
// vvv
if box Singleton.instance = null then
// ^^^
Singleton.instance <- Singleton())
Singleton.instance
有人可以详细说明为什么需要box
吗?
答案 0 :(得分:5)
给定的Singleton
类型没有null
作为正确的值。换句话说,它不可为空,通常不应具有值null
。因此,将Singleton
类型的值与null
进行比较是不明智的,即使通过[<DefaultValue>]
使用未初始化的变量可能会创建此类型的空值变量。拳击将任何东西变成obj
,这是可以为空的,因此在这种情况下是有效的。
使用Unchecked.defaultof<Singleton>
而不是null
会使装箱变得不必要并且编译。 (还有[<AllowNullLiteral>]
属性,可以将其添加到Singleton
类型,以指定此类型的实例可以是null
。)