1.程序的內存類(lèi)型
C#程序能夠使用三種類(lèi)型的內存:堆棧(stack)、托管堆(managed heap)、非托管堆(unmanaged heap)。
a. 堆棧
每一個(gè)進(jìn)程和線(xiàn)程都具有自己的一塊堆棧內存,用它來(lái)存放私有的數據。不能被其他的進(jìn)程和線(xiàn)程訪(fǎng)問(wèn)。
堆棧的一個(gè)重要特性就是 “后進(jìn)先出”,如果堆棧指針超出了堆棧的范圍,就會(huì )出現堆棧溢出錯誤。.NET框架的堆棧檢查機制確保不會(huì )出現堆棧溢出錯誤,因為,.NET框架程序的堆棧是安全的。
堆棧的性能很高,但是不太靈活,只能分配固定大小的數據類(lèi)型,而且數據的生存期必須是有序的。
b. 托管堆
托管堆是由.NET框架公共語(yǔ)言運行時(shí)的自動(dòng)內存管理來(lái)實(shí)現的。初始化新進(jìn)程時(shí),公共語(yǔ)言運行時(shí)就會(huì )為進(jìn)程保留一個(gè)連續的地址空間區域,就是托管堆。
托管堆維護著(zhù)一個(gè)指針,用它指向將在堆中分配的下一個(gè)對象的地址。每創(chuàng )建一個(gè)對象,都會(huì )在上一個(gè)對象的后面的地址空間內為它分配內存。只要地址空間可用,垃圾回收器就會(huì )繼續以這種方式來(lái)為新對象分配空間。
垃圾回收器在執行回收的時(shí)候,會(huì )釋放應用程序不再使用的對象的內存。它通過(guò)檢查應用程序的根來(lái)確定不再使用的對象。每個(gè)應用程序都有一組根。每個(gè)根或引用托管堆中的對象,或者設置為空。應用程序的根包含全局對象指針、靜態(tài)對象指針、線(xiàn)程堆棧中的局部變量和引用對象參數,以及CPU寄存器。
垃圾回收器可以訪(fǎng)問(wèn)由即時(shí)編譯和運行維護的活動(dòng)根的列表。垃圾回收器對照列表檢查應用程序的根,并在此過(guò)程中創(chuàng )建一個(gè)圖表,圖表中包含所有可以從這些根訪(fǎng)問(wèn)的對象。
c. 非托管堆
非托管堆不受.NET框架的控制,是windows管理內存,因此.NET框架的垃圾回收器不能回收釋放非托管堆中的內存,需要程序員自己負責釋放。
2.類(lèi)型
C#是完全面向對象的語(yǔ)言,它的所有數據類(lèi)型都是類(lèi)。C#語(yǔ)言的類(lèi)型劃分為兩大類(lèi):引用類(lèi)型和值類(lèi)型。
值類(lèi)型和引用類(lèi)型的不同之處在于:值類(lèi)型的變量直接包含數據,而引用類(lèi)型的變量存儲對數據的引用(reference)。對于引用類(lèi)型,兩個(gè)變量可能引用同一個(gè)對象,因為對一個(gè)變量的操作可能影響另一個(gè)變量所引用的對象。對于值類(lèi)型,每個(gè)變量都有自己的數據副本,對一個(gè)變量的操作不可能影響到另一個(gè)變量。
C#的類(lèi)型是統一的,每個(gè)類(lèi)型都直接或者間接的從object類(lèi)派生,而object是所有類(lèi)型的最終基類(lèi)。引用類(lèi)型的值被當做“對象”來(lái)處理。值類(lèi)型的值則通過(guò)執行裝箱/拆箱操作按對象處理。由于這種統一性,使用object類(lèi)型的通用庫既可以用于引用類(lèi)型,又可以用于值類(lèi)型。
| 類(lèi)別 | 說(shuō)明 | |
| 值類(lèi)型 | 簡(jiǎn)單類(lèi)型 | 有符號整型:sbyte、short、int、long |
| 無(wú)符號整型:byte、ushort、unit、ulong | ||
| Unicode字符:char | ||
| IEEE浮點(diǎn)型:float、double | ||
| 高精度小數:decimal | ||
| 布爾型:bool | ||
| 枚舉類(lèi)型 | Enum E{....}形式的用戶(hù)定義的類(lèi)型 | |
| 結構類(lèi)型 | Struct S{....}形式用定義的類(lèi)型 | |
| 引用類(lèi)型 | 類(lèi)類(lèi)型 | 所有其他類(lèi)型的最終基類(lèi):object |
| Unicode字符串:string | ||
| Class C{....}形式的用戶(hù)自定義類(lèi)型 | ||
| 接口 | Interface I{....}形式的用戶(hù)定義的類(lèi)型 | |
| 數組 | 一維和多維數組 | |
| 委托 | Delegate T D(....)形式 | |
基本類(lèi)型
編譯器直接支持的類(lèi)型叫做基本類(lèi)型(primary type)?;绢?lèi)型名都是關(guān)鍵字,代碼可以使用簡(jiǎn)單的語(yǔ)法來(lái)操作基本類(lèi)型,基本類(lèi)型是構造其他類(lèi)型的基礎數據類(lèi)型。
C#的基本類(lèi)型實(shí)際都是.NET框架類(lèi)庫中的CTS類(lèi)型的映射,都是從System.Object派生而來(lái)的。因此,一種基本類(lèi)型實(shí)際上都是一種CTS類(lèi)型的別名。
3.類(lèi)
a. 隱藏方法
在子類(lèi)中可以使用與基類(lèi)的成員相同的名稱(chēng)或簽名來(lái)聲明成員,這種情形下,在子類(lèi)中不可以訪(fǎng)問(wèn)基類(lèi)的同名成員,這叫做子類(lèi)成員的隱藏類(lèi)基本成員。在子類(lèi)成員的聲明中使用new修飾符。
new public void F()
{
}
b. 虛方法和重寫(xiě)方法
虛方法帶virtual修飾符,稱(chēng)為虛方法。不允許與static、abstract、override修飾符同時(shí)使用。
如果實(shí)例中含有override修飾符,則稱(chēng)該方法為重寫(xiě)方法。重寫(xiě)方法只能用于重寫(xiě)基類(lèi)的虛方法。
4.結構、枚舉
結構主要用于組織數據,它的優(yōu)勢是,由于是值類(lèi)型,因此開(kāi)銷(xiāo)小,效率高。結構不支持繼承,因此始終是密封的,但可以實(shí)現接口。
枚舉是一種獨特的數據類(lèi)型,,可以顯示的聲明byte、sbyte、short、ushort、int、unit、long或ulong。不能是char。
System.Enum類(lèi)型是所有枚舉類(lèi)型的抽象基類(lèi),它本身并不是枚舉類(lèi)型,而是一個(gè)類(lèi)。System.Enum類(lèi)的派生方法和屬性可以用在枚舉類(lèi)型的值上。比如GetNames可以用來(lái)獲取所有的枚舉名,GetValues可以用來(lái)獲取所有的枚舉值。
5.集合
C#的集合是基于System.Collections.ICollection接口、System.Collections.IList接口、
System.Collections.IDictionary接口來(lái)實(shí)現的。IList接口和IDictionary接口都是從ICollection接口派生的,因此所有集合都間接或直接的實(shí)現了ICollection接口。
基于IList接口的集合(如Array、ArrayList、List)或者直接基于ICollection接口的集合(如Queue、Stack、SortedList)來(lái)說(shuō),每個(gè)元素只能包含一個(gè)值,對于基于IDictionary接口的集合(如Hashtable、SortedList)來(lái)說(shuō),每個(gè)元素都有一個(gè)鍵和一個(gè)值。
System.Collections.ICollection繼承了System.Collections.IEnumerable,并沒(méi)有添加任何成員,完全等價(jià)于IEnumerable。因此所有的集合類(lèi)都必須實(shí)現System.Collections.IEnumerable接口,實(shí)現了這個(gè)接口就能一一列舉集合類(lèi)包含的數據元素:
public interface IEnumerable{
IEnumerator GetEnumerator();
}
GetEnumerator方法返回一個(gè)能夠訪(fǎng)問(wèn)集合中數組的列舉器,必須實(shí)現System.Collections.IEnumerator 接口:
public interface IEnumerator {
Boolean MoveNext();
Object Current{get;}
Void Reset();
}
列舉器用于讀取集合中的數據,但不能輕易修改基礎集合。創(chuàng )建集合對象后,列舉器應首先定位于集合中第一個(gè)元素前。Reset方法用于將列舉器返回到此位置,此時(shí),調用Current屬性會(huì )引發(fā)異常。
l 容量和計數
前者是可以包含的元素的數目。計數是它實(shí)際包含的元素的數目。
l 下限
集合的下限是其第一個(gè)元素的索引。System.Collections命名空間中的所有索引金和下限均為0。Array下限默認也是0,但是使用CreateInstance創(chuàng )建Array類(lèi)的實(shí)例可以定義不同的下限。
l 列舉器
列舉器用于循環(huán)訪(fǎng)問(wèn)集合的對象,可以看成是指向集合中任何元素的可移動(dòng)的指針。一個(gè)列舉器只能與一個(gè)集合關(guān)聯(lián),但一個(gè)集合可以具有多個(gè)列舉器。
l 同步成員
同步在訪(fǎng)問(wèn)集合的元素時(shí)提供線(xiàn)程安全。默認情況下,集合不是線(xiàn)程安全的。System.Collections只有幾個(gè)類(lèi)提供Synchronize方法,該方法能夠超越集合創(chuàng )建線(xiàn)程安全包裝。但是,System.Collections命名空間中的所有類(lèi)型都提供SyncRoot屬性,可派生類(lèi)創(chuàng )建自己的線(xiàn)程安全包裝。還提供了IsSynchronized屬性以確定集合是否是線(xiàn)程安全的。
l CopyTo方法
CopyTo方法可將所有集合復制到數組中;但是,新數組中元素的順序基于列舉器返回他們的順序。
聯(lián)系客服