2010-02-11 30 views
5

Uso Nullable<T> tipos bastante cuando se cargan valores en clases y estructuras cuando necesito que sean anulables, como cargar un valor que se puede nulos de una base de datos (como el ejemplo a continuación).Casting (int?) Null vs. new int?() - ¿Qué es mejor?

Considere este fragmento de código:

public class InfoObject 
{ 
    public int? UserID { get; set; } 
} 

// Load the ID into an SqlInt32 
SqlInt32 userID = reader.GetSqlInt32(reader.GetOrdinal("intUserID")); 

Cuando necesito cargar un valor en una propiedad anulable, a veces hago esto:

infoObject.UserID = userID.IsNull ? (int?)null : userID.Value; 

veces hago esto en su lugar:

infoObject.UserID = userID.IsNull ? new int?() : userID.Value; 

Aunque logran el mismo resultado, me gustaría ver si alguien sabe cuál es mejor usar entre (int?)null y new int?() con respecto al rendimiento, el código IL más pequeño, las mejores prácticas, etc.?

lo general he estado favoreciendo la versión new int?() del código anterior, pero no estoy seguro de si la fundición (int?)null es más rápido que el compilador de resolver que new int?().

¡Salud!

Respuesta

8

Generarán la misma IL. Use lo que le resulte más fácil de leer.

Cuando habla de que algo es "más rápido de resolver para el compilador" ¿está hablando de microoptimizar su compilación veces? No tengo idea de cuál sería más rápido allí, pero dudo que haga una diferencia confiablemente medible para cualquier cuerpo significativo de código.

Personalmente uso null siempre que puedo hacerlo sin ambigüedad; Creo que, en general, todavía prefiero que el elenco llame al new, pero no hace la diferencia.

+0

Estoy de acuerdo con usted. '(int?) null' se ve mucho mejor que' new int?() 'especialmente cuando se usa dentro de sentencias condicionales en línea como muestra mi ejemplo. Con respecto a su pregunta: usted respondió cuando dijo que IL es el mismo. Los tiempos de compilación no son actualmente un problema (a menos que use TFSBuild, pero esa es una historia completamente diferente) así que mientras que IL coincida, estoy feliz :) – Codesleuth

+0

Mi favorito (con la versión del reparto como segundo muy cercano) es 'default (int?)'. – sblom