2015-09-23 46 views
1

我只是創建一個輔助方法來計算根據下面的答案在多個值的哈希:未經檢查的關鍵字適用於代表?

What is the best algorithm for an overridden System.Object.GetHashCode?

作爲遵循的方法:

static int HashItems(params object[] items) 
{ 
    unchecked 
    { 
     const int prime1 = 17; 
     const int prime2 = 23; 

     return items 
      .Select(item => item != null ? item.GetHashCode() : 0) 
      .Aggregate(prime1, (current, itemHash) => current*prime2 + itemHash); 
    } 
} 

現在,這讓我不知道是什麼未經檢查的範圍確實是。未檢查是適用於當前創建的函數的東西,但由於我們使用Linq,我不確定會發生什麼。創建一個委託會在編譯時創建一個新類,但是這個代理/類也會應用未經檢查的關鍵字嗎?文檔不清楚(https://msdn.microsoft.com/en-us/library/a569z7k8.aspx)。

我知道下面的結構,雖然的:

static int HashItems(params object[] items) 
{ 
    const int prime1 = 17; 
    const int prime2 = 23; 

    return items 
     .Select(item => item != null ? item.GetHashCode() : 0) 
     .Aggregate(prime1, (current, itemHash) => unchecked(current*prime2 + itemHash)); 
} 

回答

2

(un)checked是一個C#級別的結構。它表現爲不同的IL指令用於算術。所以CLR不參與這個問題。在CLR級別沒有「範圍」。

(un)checked使用語法範圍。任何語法上在這樣的範圍內的算術指令都會受到影響。 lambda 受您使用unchecked影響。

您可能應該更喜歡第二個代碼塊,因爲它將unchecked命令應用於更接近實際生效的點。理解更清楚。