Tengo una clase llamada A
. ¿Cuál es la diferencia entre estas dos afirmaciones?cuál es la diferencia entre el constructor predeterminado y el predeterminado
A a = new A();
A a = default(A);
Tengo una clase llamada A
. ¿Cuál es la diferencia entre estas dos afirmaciones?cuál es la diferencia entre el constructor predeterminado y el predeterminado
A a = new A();
A a = default(A);
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.).
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.
El valor predeterminado de value-types NO está sin inicializar. Se inicializa a cero. – CodesInChaos
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
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.
@Fermaref - No estoy seguro de dónde lo obtuviste. La declaración 'var x = default (TestClass);' asigna 'null' a' x' –
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