2012-12-20 10 views
13

Ich habe gerade die Referenzquelle .NET 4.5 von Microsoft installiert, während ich versuche, ein Problem, das ich sehe, zu debuggen, und ich stolperte in HttpApplication.cs über die folgenden.Ist `_ [....]` eine gültige Kennung?

Beachten Sie die vorletzte Zeile private bool _[....]; // per call.

Ist _[....] ein gültiger Bezeichner (auf jeder Kompilierungsstufe, einschließlich IL) oder wurde die Quelle seit der Kompilierung geändert?

+6

Offensichtlich nicht, oder haben Sie versucht, es nicht zu kompilieren? Der Compiler geht davon aus, dass es sich um eine ungültige Array-Deklaration handelt. –

+1

Sie können es nicht kompilieren, da die Referenzquelle nicht mit einer Lösungsdatei geliefert wird. Ich bin mir ziemlich sicher, dass es kein gültiger Bezeichner in ** user-land ** C# ist, aber ich weiß, dass der Compiler Klassennamen und dergleichen generiert, die Sie oder ich nicht in Visual Studio schreiben konnten, und fragt daher, ob es überhaupt gültig ist Kompilierungsgrad einschließlich IL. –

+1

@Bobson MS führt eine Reinigung der Referenzquelle durch, hauptsächlich in Bezug auf Kommentare. Schätze, dass ihre Putzfrau etwas zu viel "gereinigt" hat. – CodesInChaos

Antwort

8

Nein; das ist nicht gültig.

Bevor die Quelle freigegeben wurde, führte Microsoft ein schlecht geschriebenes internes Tool durch, das alle Angestelltennamen durch [....] ersetzt.
Leider ersetzt das Tool auch die tatsächliche Quelle.

Dies ist eigentlich kontraproduktiv; Sie können herausfinden, was die verborgene Quelle eigentlich ist, indem Sie in den kompilierten Metadaten nachsehen (zB in Reflector).

Ihre besondere Linie private bool _sync

+0

Guter Grund, keine Variable nach dir zu benennen ... – Bobson

+2

Du meinst, der Code wird unlesbar sein, sobald John Foo seinen Job bei MS beginnt? ;) – igrimpe

+0

@igrimpe: Ich glaube es tut nur Benutzernamen. – SLaks

3

sein sollte Während @SLaks Antwort ist höchstwahrscheinlich die richtige, dann ist es wichtig zu beachten, dass dies ein potentiell gültigen Bezeichner an der IL-Ebene, ECMA 335 Partition II, Abschnitt 5.3 heißt es:

[T] Die ILAsm-Syntax erlaubt die Verwendung eines beliebigen Bezeichners, der mit dem Unicode-Zeichensatz gebildet werden kann (siehe Partition I). Um dies zu erreichen, muss ein Identifikator in einfache Anführungszeichen gesetzt werden.

Hier finden Sie absolut gültige IL, die auf der Konsole Falsch ausdruckt:

.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

@ SLaks Antwort ist korrekt. Diese Frage ist auf SO mindestens zweimal aufgetaucht und wurde mindestens einmal von einem Microsoft-Mitarbeiter mit Zugriff auf das Tool beantwortet, aber ich bin zu faul, sie zu finden. – Brian