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