2010-11-28 10 views

Respuesta

13

Esto crea una nueva instancia del tipo A llamando al defecto, constructor sin parámetros:

A a = new A(); 

Esto asigna el valor predeterminado para el tipo A a la variable a y no llama a ningún constructor en todo:

A a = default(A); 

la diferencia principal es que el valor predeterminado de un tipo es null de referen tipos de ce y un valor de cero para todos los tipos de valor (por lo que default(int) sería 0, default(bool) sería false, etc.).

+6

@Fermaref - No estoy seguro de dónde lo obtuviste. La declaración 'var x = default (TestClass);' asigna 'null' a' x' –

+0

bien, capté mi error. Al parecer, le proporcioné un parámetro de valor de tipo cuando intenté usarlo, no el nombre de tipo, y esto solo funciona en genéricos. Lo siento. – Femaref

0

La nueva palabra clave siempre señala la asignación de memoria para los tipos de referencia. Ningún otro constructo realmente crea espacio en la memoria para los datos que está a punto de crear. Para los tipos de valor, su memoria siempre se asigna previamente cuando se usa en una función o procedimiento. La palabra clave default permite que un tipo genérico devuelva su valor predeterminado (sin inicializar) o null para los tipos de referencia.

+0

El valor predeterminado de value-types NO está sin inicializar. Se inicializa a cero. – CodesInChaos

+0

Tiene razón, pero el usuario no inicializó lo que quise decir sin inicializar (como 'int i = 100;'), sino el compilador. Perdón por la confusión. – ja72

2

Para los tipos de valor no hay diferencia, ya que el constructor predeterminado de un tipo de valor siempre es equivalente al valor predeterminado (T). Simplemente llena todo con 0, null, 0.0 ... En la implementación predeterminada de .net esto solo corresponde a llenar todo en su variable con cero binario.

Para los tipos de referencia new T() llama al constructor predeterminado y devuelve una referencia (normalmente) no nula.
default(T) por otro lado es equivalente a null en este caso.

default(T) es importante porque representa un valor válido de T, independientemente de si T es un tipo de referencia o de valor. Esto es muy útil en la programación genérica.
Por ejemplo, en funciones como FirstOrDefault necesita un valor válido para su resultado en el caso en que el enumerable no tenga entradas. Y solo usa default(T) para eso ya que es lo único válido para cada tipo.

Además, llamar al constructor predeterminado en los tipos de referencia requiere una restricción genérica. Y no todos los tipos de referencia implementan un constructor predeterminado. Entonces no siempre puedes usarlo.

Cuestiones relacionadas