2011-09-07 12 views
5

Oggi mentre gioca con un De-compilatore, i decompilato .NET C# Char classe e non v'è uno strano caso, che non capiscoEstratto multi reso STRANO?

public static bool IsDigit(char c) 
{ 
    if (char.IsLatin1(c) || c >= 48) 
    { 
     return c <= 57; 
    } 
    return false; 
    return CharUnicodeInfo.GetUnicodeCategory(c) == 8;//Is this Line Reachable if Yes How does it work ! 
} 

ho usato Telerik JustDecompile

+4

No, non è raggiungibile. Forse qualcuno è compilato senza ottimizzazioni, quindi l'IL è lì, e il decompilatore lo cattura alla lettera. –

+0

Quale versione del framework .NET è questa e quale decompilatore hai usato? –

+0

@Adam Huldsworth forse dovresti scrivere quel commento come una risposta così in un secondo momento che potrei eventualmente contrassegnarlo come corretto! – Burimi

risposta

3

pensate che il vostro decompilatore potrebbe essere rischioso ... con riflettore ottengo:

public static bool IsDigit(char c) 
{ 
    if (!IsLatin1(c)) 
    { 
     return (CharUnicodeInfo.GetUnicodeCategory(c) == UnicodeCategory.DecimalDigitNumber); 
    } 
    return ((c >= '0') && (c <= '9')); 
} 

E con ILSpy ottengo:

public static bool IsDigit(char c) 
{ 
    if (char.IsLatin1(c)) 
    { 
     return c >= '0' && c <= '9'; 
    } 
    return CharUnicodeInfo.GetUnicodeCategory(c) == UnicodeCategory.DecimalDigitNumber; 
} 
+0

maledetto riflettore sta emettendo la negazione di ILSpy LOL! – Burimi

+0

Im Contrassegna questa risposta come corretta, ma tutte le risposte sono corrette, ma la tua ha Output da 2 Compilatore, quindi vado a contrassegnare come corretto. – Burimi

+0

Preferisco sempre la quantità rispetto alla qualità. 8oP – MrKWatkins

1

Si guarda come il decompilatore che hai usato non è molto bravo in quello che sta facendo.

ecco l'output del dotPeek per tale metodo:

public static bool IsDigit(char c) 
{ 
    if (!char.IsLatin1(c)) 
    return CharUnicodeInfo.GetUnicodeCategory(c) == UnicodeCategory.DecimalDigitNumber; 
    if ((int) c >= 48) 
    return (int) c <= 57; 
    else 
    return false; 
} 
+0

im Utilizzo di Just-Decompiler Teleric – Burimi

+3

Ora sai: non usarlo più ;-) –

+0

dotPeek non sempre fornisce anche soluzioni corrette, ma quando un decompilatore dà risultati che sono ovviamente sbagliati, è sempre una buona idea controllare con un diverso decompilatore (o dare un'occhiata al IL). – dtb

1

Credo che la vostra decompilatore risiede.

codice dotPeek:

public static bool IsDigit(char c) 
    { 
     if (char.IsLatin1(c)) 
     { 
     if ((int) c >= 48) 
      return (int) c <= 57; 
     else 
      return false; 
     } 
     else 
     return CharUnicodeInfo.GetUnicodeCategory(c) == UnicodeCategory.DecimalDigitNumber; 
    } 
2

Presumo che questo è un bug nel decompilatore che hai usato.

Nel framework .NET 4.0, LO Spy mostra il seguente codice:

public static bool IsDigit(char c) 
{ 
    if (char.IsLatin1(c)) 
    { 
     return c >= '0' && c <= '9'; 
    } 
    return CharUnicodeInfo.GetUnicodeCategory(c) 
      == UnicodeCategory.DecimalDigitNumber; 
} 
+0

Quindi troviamo che Reflector e IlSpy sono i migliori :-) – xanatos

+0

Mi piace l'output di ILSpy un po 'di più, sembra più pulito, anche se tecnicamente è lo stesso. –

+0

Anch'io, perché controlla un positivo anziché un negativo. – xanatos