2010-03-23 2 views
20

Nel nostro proprio C# in depth Jon Skeet, discute i 3 modi per simulare un 'null' per i tipi di valore:come sono implementati i tipi nullable sotto il cappuccio in .net?

  • valore magico (ad esempio prima DateTime possibile è considerato 'nullo') Tipo di
  • di riferimento wrapper
  • booleano

viene menzionato che tipi nullable usa il terzo metodo. Come funzionano esattamente i tipi nullable sotto il cofano?

+4

plug spudorato: ho scritto un post sul blog su come funziona un po 'di tempo fa: http://softwareblog.alcedo.com/post/2010/02/16/Nullable3cT3e-vs-null.aspx –

+0

@ FredrikMörk Il link non è più disponibile ... –

+0

@ M.Mimpen Ora è di nuovo disponibile. Quel tipo di blog si è schiantato su di me qualche tempo fa, ma ho ripubblicato altrove, ma ho reindirizzamenti per l'url originale. –

risposta

35

In definitiva, sono solo una struttura generica con un flag bool - tranne con regole di boxing speciali. Poiché le strutture sono (per impostazione predefinita) inizializzato a zero, le impostazioni predefinite bool false (nessun valore):

public struct Nullable<T> where T : struct { 
    private readonly T value; 
    private readonly bool hasValue; 
    public Nullable(T value) { 
     this.value = value; 
     hasValue = true; 
    } 
    public T Value { 
     get { 
      if(!hasValue) throw some exception ;-p 
      return value; 
     } 
    } 
    public T GetValueOrDefault() { return value; } 
    public bool HasValue {get {return hasValue;}} 
    public static explicit operator T(Nullable<T> value) { 
     return value.Value; } 
    public static implicit operator Nullable<T>(T value) { 
     return new Nullable<T>(value); } 
} 

differenze aggiuntivi, però:

  • regole speciali boxe (non si può normalmente fare questo)
  • regole speciali C# per il confronto su null ecc
  • operatori "sollevato" in C# (e in .NET tramite EqualityComparer<T>, Comparer<T> ecc)
  • regole speciali su g vincoli di tipo enerica (per evitare Nullable<Nullable<T>>)
+1

Come viene gestita la boxe? Posso implementare le mie regole di boxe per le mie strutture? –

+1

È gestito da regole speciali nella CLI. No, tu * non puoi * farlo da solo. Allo stesso modo gli operatori "sollevati" non sono qualcosa che puoi fare da solo. –

+1

Vale anche la pena notare che il comportamento degli operatori è regolato dalla lingua - C# e VB hanno regole diverse su questo per i vari operatori. –

4

Nullable<T> opere fornendo due campi:

private bool hasValue; 
internal T value; 

Le proprietà funzionano da quelle. Se lo si imposta su null, hasValue è impostato su falso.

+0

Ma non è semplicemente possibile perché 'T' e' Nullable 'sono structuress e la struttura non può essere facilmente impostata su' null'. – honzakuzel1989