2010-03-23 19 views
20

En nuestra propia de C# in depth Jon Skeet, que analiza las 3 formas para simular un 'nulo' para los tipos de valor:¿Cómo se implementan los tipos anulables bajo el capó en .net?

  • valor mágico (por ejemplo DateTime antes posible se toma como 'nulo') Tipo de
  • Referencia envoltorio
  • bandera booleana

se menciona que los tipos anulables utilizan el tercer método. ¿Cómo funcionan exactamente los tipos que aceptan nulos bajo el capó?

+4

shameless plug: Escribí una publicación de blog sobre cómo funciona hace un tiempo: http://softwareblog.alcedo.com/post/2010/02/16/Nullable3cT3e-vs-null.aspx –

+0

@ FredrikMörk El enlace ya no está disponible ... –

+0

@ M.Mimpen Ahora está disponible de nuevo. Ese blog se estrelló contra mí hace un tiempo, pero lo he vuelto a publicar en otro lado, pero tengo redirecciones para las url originales. –

Respuesta

35

En última instancia, son simplemente una estructura genérica con una bandera bool, excepto con reglas especiales de boxeo. Debido a que las estructuras son (por defecto) inicializado a cero, los valores por defecto bool false (sin valor):

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); } 
} 

diferencias adicionales, sin embargo:

  • reglas especiales de boxeo (normalmente no puede hacer esto)
  • reglas especiales C# para comparar a null etc
  • "levantadas" operadores en C# (y en .NET través EqualityComparer<T>, Comparer<T> etc)
  • normas especiales sobre g restricciones de tipo eneric (para evitar Nullable<Nullable<T>>)
+1

¿Cómo se maneja el boxeo? ¿Puedo implementar mis propias reglas de boxeo para mis propias estructuras? –

+1

Se maneja mediante reglas especiales en la CLI. No, usted * no puede * hacer esto usted mismo. Del mismo modo, los operadores "levantados" no son algo que pueda hacer usted mismo. –

+1

También vale la pena señalar que el comportamiento de los operadores se rige por el idioma: C# y VB tienen reglas diferentes para varios operadores. –

4

Nullable<T> funciona proporcionando dos campos:

private bool hasValue; 
internal T value; 

Las propiedades de las que trabajan. Si lo configura en null, hasValue se establece en falso.

+0

Pero no es simplemente posible porque 'T' y' Nullable 'son estructuras y la estructura no se puede establecer fácilmente en' null'. – honzakuzel1989

Cuestiones relacionadas