文章出處

類型的各種成員

在一個類型中,可以定義0個或多個以下成員

  • 常量 指出數據值恒定不變的一個符號,常量通常與類型關聯而不是類型的實例。
  • 字段 表示一個只讀或可讀/可寫的數據;字段即可以是靜態的也可以是實例成員,靜態字段被認為是類型的一部分,而實例字段是對象的一部分;建議將字段聲明為私有的,防止被類型外部的代碼破壞對象的狀態或類型。
  • 實例構造器 將對象實例字段初始化為初始狀態的一種特殊方法。
  • 類型構造器 將類型的靜態字段初始化為初始狀態的一種特殊方法。
  • 方法 作用是更改類型或對象的狀態。
  • 操作符重載 實際上也是一個方法,它將一個特定的操作符作用于對象時,該如何操作對象。
  • 轉換操作符 定義如何隱式或顯式的將一種類型轉換為另一種類型的方法。
  • 屬性 利用屬性,可以使用一種簡單的、字段式的風格操作類型或對象的部分邏輯狀態,同時保證不遭到破壞。
  • 事件 使用靜態事件,一個類型可以向一個或多個靜態類型或實例方法發送通知;而實例事件,一個對象可以向一個或多個靜態類型或實例方法發送通知;事件包含兩個方法,允許靜態或實例方法注冊或注銷對該事件的關注,除了這兩個方法,事件還用委托字段來維護已登記的方法集。
  • 類型 類型可以嵌套于其他類型

類型的可見性

在文件范圍中定義類型時,可將類型的可見性定義為public(對所有代碼可見,包括其他程序集)和internal(僅對類型定義的程序集中的代碼可見),默認為internal

友元程序集

想要訪問internal定義的類型,又不想被第三方的用戶訪問,就可以通過友元程序集來實現;在vs項目中,我們可以把這一特性加到程序集中的AssemblyInfo.cs文件中

//在當前程序集中internel類型可以由以下(Hell)程序集中的任何代碼訪問
[assembly: InternalsVisibleTo("Hell,PulicKey=12345698766...")]

成員的可訪問性

在代碼中引用一個成員時,成員的可訪問性指出了這種引用是否合法

訪問修飾符 描述
private 成員只能由定義類型的或者嵌套類型中的方法訪問
protected 成員只能由定義的類型、嵌套類型或者無論在任何程序集中的派生類型中的方法訪問
internal 只能由程序集中的方法訪問
protected internal 成員可由任何嵌套類型、任何派生類型或者定義程序集中的任何方法訪問
pubic 任何程序集中的方法都可以訪問

任何成員想要被訪問,必須在可見的類型中定義;在C#中,如果沒有顯示的制定成員的可訪問性,默認為private

靜態類

靜態類在使用的時候不需要實例化,在C#中static只能用于類,而不能用于結構(值類型),因為CLR總是允許值類型實例化。C#編譯器將靜態類編譯為抽象密封類,且在類型中不會生成實例構造器方法。

靜態類的幾點特性

  • 靜態類必須從Object派生,從其他類型派生沒有任何意義。繼承只適用于對象。
  • 靜態類不能實現任何接口,因為只有使用類的實例時,才可以調用類的接口方法。
  • 靜態類只能定義靜態成員(字段、屬性、方法和事件)
  • 靜態類不能用作字段、方法參數或局部變量使用

分部類、結構和接口

分部類、結構和接口這些功能都是由C#編譯器提供支持,CLR對此一無所知。
使用關鍵字partial,將一個類、結構或者接口定義的源碼可能要分散到一個或者多個源碼文件中

組件、多態和版本控制

組件

將應用程序的各個功能(已經完成的單獨模塊)分散到別的個人或者公司,再開發新系統的時候不用再重復造輪子,直接通過使用三方的模塊,這樣減少了開發量,減少了復雜度,大大提升了開發的效率

CLR關于方法調用

方法代表在類型或類型實例上執行某些操作的代碼,在類型上操作的為靜態方法,在類型實例上的為非靜態方法。任何方法都有一個名稱、一個簽名和一個返回值(含void
編譯器在編譯實例方法、虛方法和靜態方法代碼時會用一組標記來指明,其他代碼通過標記來改如何生成正確的IL代碼來調用。CLR提供了兩個方法調用指令

  • call 這個指令可以調用靜態方法、實例方法和虛方法。調用靜態方法必須制定類型,調用實例方法或者虛方法必須制定一個引用對象的變量,且變量不能為null。
  • callvirt 這個IL指令可以調用虛方法和實例方法,不能調用靜態方法。調用非虛方法時,變量的類型指明了CLR調用的方法是在哪個類型中定義的;調用虛方法時,CLR確認發出調用的對象的實際類型,然后以多態方式調用。

callvirt調用前需要檢查變量是否為null,所以性能上略微慢于call。但是他可以檢查發出調用的對象是否為null。
設計一個類型時,盡量少用虛方法;首先,是性能問題,調用虛方法速度比較慢;其次,JIT不能內嵌虛方法;第三,不利于版本控制;第四,定義基類時,需要提供一組重載的簡便方法。

參考:CLR via C#


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()