2012-12-20 18 views
13

Ho appena installato la fonte di riferimento .NET 4.5 di Microsoft poiché sto cercando di eseguire il debug di un problema che sto vedendo e sono incappato in ciò che segue in HttpApplication.cs.È `_ [....]` un identificatore valido?

// execution step -- call asynchronous event 
internal class AsyncEventExecutionStep : IExecutionStep { 
    private HttpApplication  _application; 
    private BeginEventHandler _beginHandler; 
    private EndEventHandler  _endHandler; 
    private Object    _state; 
    private AsyncCallback  _completionCallback; 
    private AsyncStepCompletionInfo _asyncStepCompletionInfo; // per call 
    private bool    _[....];   // per call 
    private string    _targetTypeStr; 

Si noti la penultima riga private bool _[....]; // per call.

_[....] è un identificatore valido (a qualsiasi livello di compilazione, incluso IL) o la fonte è stata modificata dalla compilazione?

+6

Ovviamente no, o non hai provato a compilarlo? Il compilatore presume che sia una dichiarazione di array non valida. –

+1

Non è possibile compilarlo perché la fonte di riferimento non viene fornita con un file di soluzione. Sono abbastanza sicuro che non sia un identificatore valido in ** user-land ** C#, ma so che il compilatore genera nomi di classi e simili che tu o io non potremmo scrivere in Visual Studio, quindi chiedendo se è valido in qualsiasi livello di compilazione compreso IL. –

+1

@Bobson MS esegue una pulizia della fonte di riferimento, principalmente correlata ai commenti. Indovina il loro addetto alle pulizie "pulito" un po 'troppo. – CodesInChaos

risposta

8

No; non è valido

Prima di rilasciare la fonte, Microsoft ha eseguito uno strumento interno mal scritto che sostituisce tutti i nomi dei dipendenti con [....].
Sfortunatamente, lo strumento sostituisce anche la sorgente effettiva.

Questo è in realtà controproducente; puoi scoprire che cosa fosse in realtà la maggior parte della sorgente nascosta guardando nei metadati compilati (ad esempio, in Reflector).

La vostra linea particolare dovrebbe essere private bool _sync

+0

Un buon motivo per non nominare una variabile dopo di te ... – Bobson

+2

Vuoi dire che il codice sarà illeggibile non appena John Foo inizia il suo lavoro in MS? ;) – igrimpe

+0

@igrimpe: credo che faccia solo nomi utente. – SLaks

3

Mentre @SLaks risposta è molto probabilmente quella giusta, è importante notare che questo è un identificatore potenzialmente valida a livello di IL, ECMA 335 Partizione II, sezione 5.3 afferma:

[T] la sintassi ILAsm consente l'uso di qualsiasi identificatore che può essere formato utilizzando il set di caratteri Unicode (vedere Partizione I). Per ottenere ciò, un identificatore deve essere inserito tra virgolette singole.

Il seguente è perfettamente valida IL che stampa Falso sulla console:

.assembly 'ValidIDTest' 
{ 
} 

    .class public TestClass 
    { 
    .field static public bool '_[...]' 

    .method static void Main() cil managed 
    { 
     .entrypoint 
     ldsfld bool TestClass::'_[...]' 
     call void [mscorlib]System.Console::WriteLine(bool) 
     ret  
    } 
    } 
+0

@ La risposta di SLak è corretta. Questa domanda è venuta fuori così almeno due volte su SO ed è stata data una risposta almeno una volta da un dipendente Microsoft con accesso allo strumento, ma sono troppo pigro per trovarli. – Brian

Problemi correlati