2011-09-07 33 views
5

Hôm nay trong khi chơi với De-biên dịch, tôi phân tích với .NET C# Char Class và có một trường hợp kỳ lạ mà tôi không hiểuNhiều câu lệnh return STRANGE?

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 ! 
} 

i sử dụng Telerik JustDecompile

+4

Không, nó không thể truy cập. Có lẽ ai đó biên dịch mà không tối ưu hóa để IL có đó, và trình biên dịch lấy nó đúng nguyên văn. –

+0

Phiên bản .NET framework này là gì và trình biên dịch ngược nào bạn đã sử dụng? –

+0

@Adam Huldsworth có lẽ bạn nên viết nhận xét đó làm câu trả lời để sau này tôi có thể đánh dấu là chính xác! – Burimi

Trả lời

3

Nghĩ decompiler của bạn có thể được tinh ranh ... Với Reflector tôi nhận được:

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

Và với ILSpy tôi nhận được:

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

damn Phản xạ đang xuất hiện các Phủ định của ILSpy LOL! – Burimi

+0

Im Đánh dấu câu trả lời này là đúng, nhưng tất cả các câu trả lời là chính xác, nhưng bạn có đầu ra từ 2 trình biên dịch để im sẽ đánh dấu là đúng. – Burimi

+0

Tôi luôn ưu tiên số lượng về chất lượng. 8oP – MrKWatkins

1

Có vẻ giống như trình giải mã mà bạn đã sử dụng không phải là rất tốt ở những gì nó đang làm.

Dưới đây là đầu ra của dotPeek cho phương pháp đó:

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 Sử dụng Teleric Just-Decompiler – Burimi

+3

Bây giờ bạn biết: Đừng sử dụng nó nữa ;-) –

+0

dotPeek không phải lúc nào cũng đưa ra các giải pháp đúng, nhưng khi một trình dịch ngược cho kết quả rõ ràng là sai, nó luôn là ý tưởng hay kiểm tra với một trình giải mã khác (hoặc xem IL). – dtb

1

Tôi nghĩ decompiler của bạn nằm.

đang 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

tôi giả rằng đây là một lỗi trong trình dịch ngược mà bạn đã sử dụng.

Trong khuôn khổ .NET 4.0, IL Spy cho thấy đoạn mã sau:

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

Vì vậy, chúng tôi thấy rằng Reflector và IlSpy là những cái tốt nhất :-) – xanatos

+0

Tôi thích đầu ra của ILSpy nhiều hơn một chút, nó trông sạch hơn - mặc dù nó là về mặt kỹ thuật giống nhau. –

+0

Tôi cũng vậy, vì anh ta kiểm tra dương tính thay vì âm tính. – xanatos

Các vấn đề liên quan