類型的各種成員
在一個類型中,可以定義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#
文章列表