2015-12-21 40 views
0

我想在c#中交換任意2個變量的函數,無論它們是使用xor方法的引用還是值類型。這是否適合於此目的?在c#中的不同類型的通用異或交換

public static void QuickSwap<T>(ref T a, ref T b) 
{ 
    if (ReferenceEquals(a, b) || (typeof(T).IsValueType && a == b)) 
     return; 
    a ^= b; 
    b ^= a; 
    a ^= b; 
} 
+0

這是一個毫無意義的練習。在某個時間點,這是一個可愛的竅門,但是現在你最好寫出清晰,結構良好的代碼,並讓編譯器擔心微優化和註冊分配。 –

+0

爲什麼你需要使用XOR方法?如果是因爲你認爲這比其他選擇更快(假設你選擇的方法名稱),那麼對'typeof(T).IsValueType'的調用可能會使實際的XOR操作變矮。用一個臨時變量寫一個簡單的交換,這樣你根本不需要任何特殊的處理。 –

+0

在[Wikipedia討論它]上有一個專門的頁面(https://en.wikipedia.org/wiki/XOR_swap_algorithm):「在現代CPU架構上,XOR技術可能比使用臨時變量進行交換要慢」 - 所以如果你堅持努力做到這一點,至少要確保改正方法的名稱。 –

回答

1

沒有,因爲XOR operator in C#integral types和布爾只被定義。 (因爲它會導致無效狀態,這與C#作爲類型安全語言的設計目標相矛盾:myClass1^myClass2將指向無效的內存位置,並且結果的myStruct1^myStruct2很可能也是垃圾。)