国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

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

2019-11-17 03:23:04
字體:
來源:轉載
供稿:網友

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

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

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

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

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

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

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

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

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

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永靖县| 平原县| 民县| 香河县| 佛冈县| 兰西县| 溆浦县| 会理县| 太保市| 阜城县| 柳林县| 阿图什市| 永丰县| 营山县| 青龙| 二手房| 麟游县| 尤溪县| 盐边县| 论坛| 溆浦县| 通辽市| 喀什市| 嘉荫县| 潞西市| 疏勒县| 延安市| 顺昌县| 寿宁县| 黎川县| 阳原县| 同德县| 金阳县| 绥滨县| 华阴市| 大安市| 孝昌县| 宁远县| 汝南县| 阿坝| 三江|