C# 中「as」運算子和可空型別的意外效能差異
C# 中的「as」運算子提供了一種便捷的執行方式動態型別檢查和強制轉換。雖然看起來,使用可空類型的“as”會比傳統的“is”運算符和轉換提供效能改進,但最近的測試揭示了令人驚訝的結果。
在物件陣列包含混合的測試場景中對於整數、字串和空引用,「as」運算子的效能明顯低於「is」運算子。這是出乎意料的,因為人們會認為「as」運算子的類型檢查和值檢查的組合比兩次查詢動態類型更有效。
分析可空類型的「isinst」的 .NET 實作揭示了這一點它不是特別慢。相反,問題似乎源於在可空類型中使用“as”時所需的額外拆箱步驟。
JIT 編譯器可以為「is」運算子產生高度最佳化的程式碼,並為不可空型別進行強制轉換。然而,具有可空型別的「as」需要更複雜的 JIT 輔助函數來執行拆箱並轉換為 Nullable
使用「OfType()」和強制轉換為泛型類型的 LINQ 解的效能也比「是」運算子。這可能歸因於 JIT 輔助函數 JIT_Unbox(),該函數在轉換為 Nullable
總之,雖然「as」運算子提供了方便的語法,但它可能並不總是在使用可空型別時提供最佳效能。在效能關鍵的場景中,建議使用「is」運算子並直接轉換為所需的類型。
以上是為什麼 C#'as”運算子比可空類型的'is”慢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!