2016-04-10 21 views
3

Während Stackoverflow Surfen stieß ich auf die folgende Antwort:Warum die Box hier?

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 

Kann jemand erarbeiten, warum die hier box benötigt?

Antwort

4

Der angegebene Singleton Typ hat null nicht als richtigen Wert. Mit anderen Worten, es ist nicht nullfähig und sollte normalerweise nicht den Wert null haben. Daher ist es nicht sinnvoll, einen Wert vom Typ Singleton mit null zu vergleichen, obwohl die Verwendung einer nicht initialisierten Variablen über [<DefaultValue>] eine nullwertige Variable dieses Typs erzeugen kann. Boxen verwandelt alles in obj, das ist nullbar und daher in diesem Zusammenhang gültig.

Mit Unchecked.defaultof<Singleton> statt null würde das Boxen unnötig machen und kompilieren. (Es gibt auch das Attribut [<AllowNullLiteral>], das dem Typ Singleton hinzugefügt werden kann, um anzugeben, dass Instanzen dieses Typs null sein können.)