2009-10-15 38 views

回答

10

沒有拳擊或拆箱。你問來幹什麼?解析算法比box/unbox操作要昂貴得多,因此即使存在性能差異,您也不會「感覺」性能差異。

2

我不相信那裏有拆箱。我認爲代碼使用一個int變量並返回它,因此沒有裝箱/取消裝箱。

編輯:我同意280Z28。我只是看了一下代碼,它非常複雜。最終的價值並沒有像我想象的那樣是盒裝的,但是有一些漫長的預處理步驟可以達到目的,所以即使是裝盒,性能也不會有太大的變化。

順便說一句,如果你不知道,你可以使用Reflector自己看代碼。

+1

或者只是看看莫諾的版本。在第114行左右:http://anonsvn.mono-project.com/viewvc/trunk/mcs/class/corlib/System/Int32.cs?revision=138730&view=markup – Dykam 2009-10-15 06:31:31

0

是的。使用Reflector,你可以看到究竟發生了什麼。我看不到任何拳擊,但也有一些石膏,例如:

private static unsafe void StringToNumber(string str, NumberStyles options, ref NumberBuffer number, NumberFormatInfo info, bool parseDecimal) 
{ 
    if (str == null) 
    { 
     throw new ArgumentNullException("String"); 
    } 
    fixed (char* str2 = ((char*) str)) 
    { 
     char* chPtr = str2; 
     char* chPtr2 = chPtr; 
     if (!ParseNumber(ref chPtr2, options, ref number, info, parseDecimal) || 
      ((((long) ((chPtr2 - chPtr)/2)) < str.Length) && //cast 
      !TrailingZeros(str, (int) ((long) ((chPtr2 - chPtr)/2))))) //cast 
     { 
      throw new FormatException(Environment.GetResourceString("Format_InvalidString")); 
     } 
    } 
} 

或此,發生在一個循環:

private static unsafe char* MatchChars(char* p, string str) 
{ 
    fixed (char* str2 = ((char*) str)) //cast 
    { 
     char* chPtr = str2; 
     return MatchChars(p, chPtr); 
    } 
} 

真正的問題是 - 這樣嗎?

0

添加我的位。

「取消裝箱」的術語/技術僅適用於裝箱值類型。 因此,如果值類型變量未被裝箱(轉換爲引用類型),則可以對其進行拆箱。

在你的情況下,你有一個有效的引用類型值,它沒有範圍被拆箱。