2012-05-29 6 views
8

Sto lavorando su un codice di autenticazione personalizzato basato sul materiale di appartenenza di Microsoft. Durante l'analisi della funzionalità del profilo, ho esaminato la classe ProfileBase che si trova in System.Web.dll v4.0.30319. Ci sono alcune variabili di livello di classe che sono dichiarate come un tipo, ma poi e poi inizializzate su un valore nullo che viene lanciato su quel tipo.Microsoft sta trasmettendo null a un tipo, dovrei?

Per esempio,

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

che normalmente non inizializzare le variabili che hanno un ambito a livello di classe. Mi chiedo se questo è qualcosa che dovrei fare o quale scopo serve.

Grazie per l'illuminazione.

+10

Stai guardando il codice sorgente originale o uno disassemblato? –

+0

Questo codice è stato recuperato da Re-sharper, quindi sono sicuro che ha smontato la fonte. Grazie. –

risposta

7

Probabilmente stai guardando il disassemblied codice. Questo casting è probabilmente aggiunto dal disassemblatore e non esisteva nel codice sorgente.

Sicuramente non devi fare questo tipo di casting nel tuo codice.

6

Non ha senso; Credo che null sia sempre null - Certamente non riesco a pensare ad alcun esempio nelle lingue basate su C dove non lo è. Probabilmente è generato codice piuttosto che codice che è stato scritto esplicitamente in questo modo.

1

Cosa dice il codice: inizializza un'area di memoria per contenere un tipo di Eccezione e assegna il valore NULL a tale variabile. Poiché Exception è un tipo di riferimento, può essere nullo. Non ha senso trasmettere NULL a Exception. Forse ha generato il codice?

+0

Non sta dicendo di inizializzare nulla - non c'è 'nuovo' per allocare memoria. Sta solo dichiarando una variabile che "punta" a nulla. – Luke

+0

Il mio male - è statico - non ha letto correttamente la domanda prima di entrare. – RobertMS

1

Lo studio consigliato consiste nell'inizializzare le variabili statiche in cui sono dichiarate.

Ecco il codice di Microsoft effettivo:

///////////////////////////////////////////////////////////////////////////// 
    ///////////////////////////////////////////////////////////////////////////// 
    // 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

I cast sono generati dal decompilatore - la fonte "ufficiale" ha null, ma non trasmessa. Non vedo alcun vantaggio nell'aggiungere il cast.

Normalmente non inizializzo le variabili che hanno un ambito di livello di classe. Mi chiedo se questo è qualcosa che dovrei fare o quale scopo serve.

Il null (che è nella fonte originale) sembra essere per lo più una cosa stile. Poiché normalmente è più semplice inizializzare un campo statico nella dichiarazione, aggiungere null aggiunge un po 'di chiarezza che è stato intenzionalmente lasciato non inizializzato. Potrebbe anche servire per passare un controllo FXCop o simile su linee guida di stile.

Problemi correlati