为什么盒子在这里?

时间:2016-04-10 17:37:25

标签: f# boxing

在浏览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吗?

1 个答案:

答案 0 :(得分:5)

给定的Singleton类型没有null作为正确的值。换句话说,它不可为空,通常不应具有值null。因此,将Singleton类型的值与null进行比较是不明智的,即使通过[<DefaultValue>]使用未初始化的变量可能会创建此类型的空值变量。拳击将任何东西变成obj,这是可以为空的,因此在这种情况下是有效的。

使用Unchecked.defaultof<Singleton>而不是null会使装箱变得不必要并且编译。 (还有[<AllowNullLiteral>]属性,可以将其添加到Singleton类型,以指定此类型的实例可以是null。)