2011-08-28 9 views
8

Me gustaría saber si los enunciados siguientes alguna vez arrojan un resultado diferente para los tipos de referencia, o son idénticos?predeterminado (T) versus Activator.CreateInstance (T)

  1. default(T)
  2. Activator.CreateInstance(T)

Si son idénticos, podría utilizar siempre predeterminado (T), en este ejemplo, si el objetivo era dar salida al valor predeterminado de T ?:

if (typeof(T).IsValueType || typeof(T) == typeof(String)) 
{ 
    return default(T); 
} 
else 
{ 
    return Activator.CreateInstance<T>(); 
} 

Best way to test if a generic type is a string? (c#)

ta!

+2

No, el valor predeterminado (T) para un tipo de referencia devuelve nulo, CreateInstance() no lo hace, ya que crea un objeto de tipo T. Es difícil adivinar qué intenta realmente este código hacer. –

+2

¿No es 'default (string)' null también? – BoltClock

+0

¡Gracias por aclarar la confusión! El ejemplo de código era parte de la confusión, lo vi en la publicación stackoverflow vinculada debajo de él ... – Cel

Respuesta

14

Son completamente diferentes.

  1. default(T), cuando T es un tipo de referencia, siempre será null.
  2. Activator.CreateInstance<T>() creará una nueva instancia de ese tipo utilizando el constructor predeterminado si está presente; de ​​lo contrario, arroja MissingMethodException.
3

Siempre devolverán un resultado diferente cuando T es un tipo de referencia. default(T) devolverá null, mientras que Activator.CreateInstance<T>() devolverá una nueva instancia de T, creada utilizando T constructor sin parámetros público.

+3

O lanzar una excepción si no puede encontrar dicho constructor. – BoltClock

+0

Por supuesto. Ese es un caso excepcional en el que en realidad no devolverá nada en absoluto. – cdhowie

2

default(T) devolverá null para tipos de referencia. Activator.CreateInstance<T>() no lo hará. Un string es un tipo de referencia en .NET.

+0

+1 para la última línea para OP – nawfal

5

Para los tipos de referencia, default(T) será nulo, mientras que CreateInstance realmente devuelve un nuevo objeto de tipo T (o falla si no hay un constructor adecuado), por lo que el resultado nunca será idéntico.

2

No estoy seguro de que usted está pidiendo whate pero son diferentes:

default(T) vuelve null si T no es un tipo de valor ... la llamada CreateInstance crea una instancia y llama al constructor por defecto si hay uno (De lo contrario, se lanza una excepción) ...

Cuestiones relacionadas