2010-03-12 18 views

Respuesta

131
  • para un tipo de referencia, se devuelve null
  • para un tipo de valor distinto de Nullable<T> devuelve un valor-inicializado cero
  • Para Nullable<T> devuelve el valor vacío (pseudo-null) (en realidad , esta es una reexpresión de la segunda bala, pero vale la pena hacerlo explícito)

el mayor uso de default(T) está en los genéricos, y cosas como el patrón Try...:

bool TryGetValue(out T value) { 
    if(NoDataIsAvailable) { 
     value = default(T); // because I have to set it to *something* 
     return false; 
    } 
    value = GetData(); 
    return true; 
} 

Da la casualidad de que también lo utilizan de alguna de generación de código, donde es un dolor para inicializar campos/variables - pero si usted sabe el tipo:

bool someField = default(bool); 
int someOtherField = default(int) 
global::My.Namespace.SomeType another = default(global::My.Namespace.SomeType); 
+0

¡Muchas gracias! – NibblyPig

+0

Si creo 'clase Foo' con la propiedad' int n'. ¿Puedo "sobrecargar" 'default' para que se configure' n' para decir '5' en lugar de' 0'? –

+1

@The Machine Charmer: No. No puede sobrecargar 'default'. –

2

valor predeterminado de MyObject. Ver default Keyword in Generic Code (C# Programming Guide) (MSDN):

En las clases y métodos genéricos, una cuestión que se plantea es cómo asignar un valor predeterminado a un tipo T parametrizado cuando no se conoce el siguiente antelación:

  • Si T será un tipo de referencia o un tipo de valor.
  • Si T es un tipo de valor, ya sea un valor numérico o una estructura.

dado un t variable de un tipo parametrizado T, la declaración t = null sólo es válida si T es un tipo de referencia y t = 0 sólo funcionará para tipos de valores numéricos, pero no para estructuras. La solución es usar la palabra clave predeterminada , que devolverá nulo para los tipos de referencia y cero para los tipos de valores numéricos. Para structs, devolverá cada miembro de la estructura inicializada a cero o nulo según si son valor o tipos de referencia. El siguiente ejemplo de la clase GenericList muestra cómo usar la palabra clave predeterminada. Para obtener más información sobre , consulte Información general sobre genéricos.

public class GenericList<T> 
{ 
    private class Node 
    { 
     //... 

     public Node Next; 
     public T Data; 
    } 

    private Node head; 

    //... 

    public T GetNext() 
    { 
     T temp = default(T); 

     Node current = head; 
     if (current != null) 
     { 
      temp = current.Data; 
      current = current.Next; 
     } 
     return temp; 
    } 
} 
2

Especifica el valor por defecto de los parameter.This tipo será nulo para tipos de referencia y cero para el valor tipos.

Ver default

0

Se establecerá el valor predeterminado de un objeto a una variable: nulo para los tipos de referencia y 0 para los tipos de valor.

9

default palabra clave volverá null para tipos de referencia y zero para tipos de valores numéricos.

Para struct s, devolverá cada miembro de la estructura inicializada a cero o nulo dependiendo de si son valores o tipos de referencia.

from MSDN

Simple Sample code :<br> 
    class Foo 
    { 
     public string Bar { get; set; } 
    } 

    struct Bar 
    { 
     public int FooBar { get; set; } 
     public Foo BarFoo { get; set; } 
    } 

    public class AddPrinterConnection 
    { 
     public static void Main() 
     { 

      int n = default(int); 
      Foo f = default(Foo); 
      Bar b = default(Bar); 

      Console.WriteLine(n); 

      if (f == null) Console.WriteLine("f is null"); 

      Console.WriteLine("b.FooBar = {0}",b.FooBar); 

      if (b.BarFoo == null) Console.WriteLine("b.BarFoo is null"); 

     } 
    } 

SALIDA:

0 
f is null 
b.FooBar = 0 
b.BarFoo is null 
-1

Tal vez esto le puede ayudar:

using System; 
using System.Collections.Generic; 
namespace Wrox.ProCSharp.Generics 
{ 
    public class DocumentManager <T> 
    { 
     private readonly Queue <T> documentQueue = new Queue <T>(); 
     public void AddDocument(T doc) 
     { 
      lock (this) 
      { 
       documentQueue.Enqueue(doc); 
      } 
     } 

     public bool IsDocumentAvailable 
     { 
      get { return documentQueue.Count > 0; } 
     } 
    } 
} 

No es posible asignar nula a los tipos genéricos. La razón es que un tipo genérico también se puede instanciar como un tipo de valor, y null solo se permite con tipos de referencia. Para evitar este problema, puede usar la palabra clave predeterminada. Con la palabra clave predeterminada, null se asigna a los tipos de referencia y 0 se asigna a los tipos de valores.

public T GetDocument() 
{ 
    T doc = default(T); 
    lock (this) 
    { 
     doc = documentQueue.Dequeue(); 
    } 
    return doc; 
} 

La palabra clave por defecto tiene múltiples significados dependiendo del contexto en el que se utiliza. La instrucción switch utiliza un valor predeterminado para definir el caso predeterminado, y con los genéricos, el valor predeterminado se utiliza para inicializar los tipos genéricos en nulo o 0, dependiendo de si es un tipo de referencia o de valor.

1

La palabra clave default devuelve el valor "predeterminado" o "vacío" para una variable del tipo solicitado. Para todos los tipos de referencia (definidos con class, delegate, etc.), esto es null. Para tipos de valor (definidos con struct, enum, etc.) es un valor de ceros (por ejemplo, int 0, DateTime 0001-01-01 00:00:00, etc.).

Se usa principalmente con código genérico que se puede aplicar a los tipos de referencia y de valor, porque no puede asignar null a una variable de tipo de valor.