ref和out達到效果,傳遞的是引數的位址而不是引數本身.從clr的角度看,ref和out完全一致.會生成相同的il**.元資料幾乎完全一致,只有乙個bit除外,以區分這兩種情況.
為值型別使用out和ref,等同於為引用型別使用傳值的方式(普通的方式).
以引用的方式傳遞引數,需要引數型別和方法簽名的型別完全相同,哪怕是基類也不行
如果傳遞的不是null,會有一定的效能損失.因為在底層中會在堆上分配乙個陣列,最後垃圾**.il中方法會被新增paramarrayattribute屬性.編譯器會優先查詢沒有可變引數的方法,其次才會查詢可變引數的方法.
宣告方法的引數型別時,盡量是最弱的型別,最好是介面而不是基類.比如使用uenumerable而不是list對於方法的返回型別最好宣告為最強的型別.(子類)
1. 針對源**中的每乙個屬性,編譯器會在屬性名之前新增get_和set_字首,自動生成這些方法.c#內建了對屬性的支援.此外,編譯器還會生成屬性定義的源資料,簡建立屬性和getset方法的聯絡.但是clr不適用這些元資料,編譯器會使用這些資訊.2.public string name是自動實現的屬性,簡稱aip.aip的支援欄位的名稱是有編譯器決定的,每次重新編譯,都可能修改這個名字,在序列化和反序列化中就有問題.aip屬性必然是可讀和可寫的,不能顯示實現乙個訪問器方法,讓另乙個自動實現,如public string test set; },這樣是不可以的.
3. 屬性不能作為out 和ref引數傳遞給方法,字段可以.
如果源**中定義了多個匿名型別,而且這些型別的結構相同,屬性名稱型別相同,順序相同,就會只建立乙個匿名型別,多個例項.匿名型別還可以這樣var test=new .根據賦值的字段的名字體別確定生成的屬性的型別.
同樣,匿名陣列也是可以的.匿名型別經常和linq配合一起來使用.
匿名型別無法傳到方法的外部.
匿名型別建立之後屬性都是唯讀的.和tuple元組是一樣的.
索引器.還可以過載,可定義多個索引器.indexernameattribute可以自定義索引器生成的預設名字(item).string.chars就是這樣的乙個例子.clr並不區分有參屬性和無參屬性.
對於簡單的getset訪問器方法,jit編譯器會將**內聯,這樣使用屬性跟字段比就沒有效能損失.jit在除錯時是不會內聯的,發布時才可能會內聯.
1. 事件引數按照規則繼承自eventargs2. 對於乙個事件,編譯器會生成乙個private事件字段,以及add和remove方法,維護登記的方法列表.remove乙個不存在的註冊方法時,是不會報錯的.add的時候是會重複註冊的,不會堅持是否已經存在.
3. 如果乙個類例項登記了某乙個事件,那麼這個例項就不會被**.所以如果型別要實現dispose方法,就應該在這裡取消事件的註冊.
4. 開發人員可以顯示實現事件,使用的是eventset類.
第十章 屬性
z屬性 本章也比較簡單稍作介紹 無參屬性就是我們常見的屬性 可以封裝屬性 以執行緒安全方式訪問 有參屬性就是c 中的所引器 匿名型別 如圖遇到如下 具體點就是 上面的注釋也已經講清楚了,定義的型別之後,構造例項,然後初始化屬性。現在詳細說下 編譯器接收到 上圖 先用var 定義乙個型別,但是不具體指...
第十章 屬性
目錄 10.1 無參屬性 10.2 有參屬性 10.3 呼叫屬性訪問器方法時的效能 10.4 屬性訪問器的可訪問性 10.5 泛型屬性訪問器方法 物件導向設計和程式設計的重要原則之一就是資料封裝,意味著型別的字段不應該公開,否則很容易因為不恰單使用欄位而破壞物件的狀態。可將屬性想象成智慧型字段,即背...
資料結構習題總結之第九章和第十章
強連通分量 有向圖g中極大強連通子圖 在鄰接表的每個線形鍊錶中,各結點的順序是任意的。深度優先搜尋法dfs 在鄰接鍊錶中就是選擇第乙個結點然後跳到第幾行對應的結點 廣度優先搜尋法bfs 在鄰接鍊錶中就是遍歷一整行,然後再按照次序根據每個結點跳到對應的行遍歷。佇列實現 拓撲排序 把入度為0的結點和邊刪...