2012-05-29 14 views
8

Estoy trabajando en un código de autenticación personalizado basado en la membresía de Microsoft. Mientras buscaba en la funcionalidad Perfil, busqué en la clase ProfileBase que se encuentra en System.Web.dll v4.0.30319. Hay algunas variables de nivel de clase que se declaran como un tipo pero luego se inicializan a un valor nulo que se convierte a ese tipo.Microsoft está lanzando nulo a un tipo, ¿o sí?

Por ejemplo,

private static Exception s_InitializeException = (Exception) null; 
private static ProfileBase s_SingletonInstance = (ProfileBase) null; 
private static Hashtable s_PropertiesForCompilation = (Hashtable) null; 

Normalmente no inicializar las variables que tienen un ámbito de nivel de clase. Me pregunto si esto es algo que debería hacer o para qué sirve.

Gracias por cualquier aclaración.

+10

¿Está buscando el código fuente original o uno desensamblado? –

+0

Este código fue recuperado por Re-sharper, así que estoy seguro de que desensambló la fuente. Gracias. –

Respuesta

7

Probablemente se esté mirando el disassemblied código. Probablemente el desensamblador haya agregado este fundido y no existía en el código fuente.

Definitivamente no tiene que hacer este tipo de fundición en su código.

6

No tiene sentido; Creo que null es siempre null - Ciertamente no puedo pensar en ejemplos en los idiomas basados ​​en C donde no lo es. Probablemente se haya generado código en lugar de código que se haya escrito explícitamente de esa manera.

1

Lo que dice el código: inicializa un área de memoria para contener un tipo de excepción y asigna el valor NULL a esa variable. Como Exception es un tipo de referencia, puede ser nulo. No tiene sentido convertir NULL en Excepción. Tal vez código generado?

+0

No se dice inicializar nada; no hay 'nuevo' para asignar memoria. Simplemente está declarando una variable que 'apunta' a nada. – Luke

+0

Malo - es estático - no leí la pregunta correctamente antes de saltar. – RobertMS

1

La práctica recomendada es inicializar las variables estáticas donde se declaran.

Aquí es el código real de Microsoft:

///////////////////////////////////////////////////////////////////////////// 
    ///////////////////////////////////////////////////////////////////////////// 
    // Static data 
    private static SettingsPropertyCollection s_Properties = null; 
    private static object s_InitializeLock = new Object(); 
    private static Exception s_InitializeException = null; 
    private static bool s_Initialized = false; 
    private static ProfileBase s_SingletonInstance = null; 
    private static Hashtable s_PropertiesForCompilation = null; 
1

Los moldes son generados por su descompilador - la fuente "oficial" tiene null, pero no el yeso. No veo ningún beneficio al agregar el elenco.

Normalmente, no inicializo las variables que tienen un alcance de nivel de clase. Me pregunto si esto es algo que debería hacer o para qué sirve.

El null (que es en la fuente original) parece ser sobre todo una cosa estilo. Dado que normalmente es más fácil inicializar un campo estático en la declaración, al agregar null se agrega un poco de claridad de que se dejó intencionalmente sin inicializar. También podría servir para aprobar un control FXCop o similar en las pautas de estilo.

Cuestiones relacionadas