为什么这里的盒子?
Why the box here?
在浏览 Whosebug 时,我偶然发现了以下答案:
// ... 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
吗?
给定的 Singleton
类型没有 null
作为正确的值。换句话说,它不可为空,通常不应具有值 null
。因此,将类型 Singleton
的值与 null
进行比较是不明智的,即使通过 [<DefaultValue>]
使用未初始化的变量可能会创建此类型的空值变量。装箱将任何东西变成 obj
,它可以为 null,因此在此上下文中有效。
使用 Unchecked.defaultof<Singleton>
而不是 null
将使装箱变得不必要并编译。 (还有[<AllowNullLiteral>]
属性,可以加在Singleton
类型上,指定该类型的实例可以是null
。)
在浏览 Whosebug 时,我偶然发现了以下答案:
// ... 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
吗?
给定的 Singleton
类型没有 null
作为正确的值。换句话说,它不可为空,通常不应具有值 null
。因此,将类型 Singleton
的值与 null
进行比较是不明智的,即使通过 [<DefaultValue>]
使用未初始化的变量可能会创建此类型的空值变量。装箱将任何东西变成 obj
,它可以为 null,因此在此上下文中有效。
使用 Unchecked.defaultof<Singleton>
而不是 null
将使装箱变得不必要并编译。 (还有[<AllowNullLiteral>]
属性,可以加在Singleton
类型上,指定该类型的实例可以是null
。)