程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> [CLR via C#]5.4 對象哈希碼和dynamic基元類型

[CLR via C#]5.4 對象哈希碼和dynamic基元類型

編輯:C#入門知識

  FCL的設計者認為,如果能將任何對象的任何實例放到一個哈希表集合中,會帶來很多好處。為此,System.Object提供了虛方法GetHashCode,它能獲取任意對象的Int32哈希值。

  如果你重寫了Equals方法,那麼還應重寫GetHashCode方法。因為在System.Collection.Hashtable類型、System.Collections.Generic.Dictionary類型以及其他一些集合實現中,要求兩個對象為了相等,必須具有相同的哈希碼,所以重寫了Equals,那麼還應該重寫GetHashCode,確保相等性算法和對象哈希碼算法是一致的。     System.ValueType實現的GetHashCode采用了反射機制(它的速度較慢),並對類型的實例字段執行的XOR運算。建議自己實現GetHashCode,這樣才能確切的掌握它所做的事,而且你的實現會比ValueType的實現快一些。     在自己實現哈希表集合時,或調用GetHashCode,千萬不要對哈希碼進行持久化,因為哈希碼很容易改變。

  為了方便開發人員使用發生或者與基本組件通信,C#編譯器允許將一個表達式的類型標記為dynamic.還可將一個表達式的結果放在一個變量中,並將變量的類型標記為dynamic,然後,可以用這個dynamic表達式/變量調用一個成員,比如字段、屬性/索引器、方法、委托等。

  代碼使用dynamic表達式/變量調用一個成員時,編譯器會生成特殊的IL代碼來描述所需要的操作。這種特殊的代碼稱為payload(有效載荷)。在運行時,payload代碼根據當前有dynamic表達式/變量引用的對象的實際類型來決定具體執行的操作。

   不要混淆dynamic和var。用var聲明的局部變量只是一種簡化語法,它要求編譯器根據一個表達式推斷具體的數據類型。var關鍵字只能用於聲明方法內部的局部變量,而dynamic關鍵字可用於局部變量,字段和參數。表達式不能轉型為var,但可以轉型為dynamic。必須實現初始化化var聲明的變量,但無需初始化用dynamic聲明的變量。

  dyna表達式其實與System.Object一樣的類型。編譯器假定你在表達式上進行任何操作都是合法的,所以不會生成任何警告和錯誤。但是試圖在運行時執行無效操作,就會拋出異常。

  不能定義對dynamic進行擴展的擴展方法,但可以定義對Object進行擴展的擴展方法。

  不能講Lambda表達式或者匿名方法作為實參傳給dynamic方法調用,因為編譯器不能推斷出要使用的類型。

  C#內建的動態求值功能所產生的額外開銷是不容忽視的。雖然能用動態功能簡化語法,但也要看是否值得。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved