C 陣列研究

2021-06-01 23:00:14 字數 1873 閱讀 2786

問題:【陣列】、【集合】、【泛型集合】的區別與聯絡。

【陣列】c#陣列是個很重要的概念,在c#類庫中,它屬於基本常用的型別,和int,string等是一級別的,是c#最基礎、最核心的部分,它是相同型別的一組集合,當然,它也是安全的;但陣列確實也比較奇怪,它到底屬於什麼型別?比如int a,a a1;確實找不到a或a1的型別定義,即使在cil中也無此定義,如果用a.gettype(),你得到是system.int32----這不純屬扯淡嘛,這種型別找的著嗎?

但有兩點需要注意:其一,陣列也是乙個物件,它派生於抽象類array;其二,陣列物件的例項化和c#中其它任何引用型別的例項化都不相同,引用型別是.newobj,而陣列是.newarr指令。這兩點很重要,我們可以推測下陣列物件的型別到底是什麼,諸如c#編譯器遇到int,a,b……..等時,應該對映成各個繼承array的可類,然後才是例項化,這咋一看有理,再想想就可笑了,il只有個.newarr指令;如果我們要用c#設計乙個高效可重用的陣列類,我們怎麼辦?這幾乎是不可能的,其實陣列很容易理解,剛才的newarr就說明了一切,c#中的陣列操作已經固化成乙個特定的指令了,這樣它就和其它型別不一樣了,顯得低階化了;實際看來,c#陣列和泛型的效率至少不低於c/c++及stl,它們不是被物件導向化了,而是虛擬了物件導向,這樣看來,它們的實現不是物件導向的封裝,至少是c/c++級別的特定安全實現,甚至是用彙編或機器指令寫的,如此看來,再索求陣列和泛型是什麼型別時倒顯得有些荒唐了,我們姑且就認為它是物件導向化了,當然看到的都是假象,這些假象中又最重要的一點---這個所謂的假陣列物件也有乙個假的索引器,這樣看起來和真實物件的索引器就是乙個概念。

c#陣列物件的特點就是虛擬成了物件導向,有了索引器概念,是物件導向的,是安全的,又是很高效的,

當然也是最不靈活

的!

【集合】由於要靈活,集合就產生了,它是做為乙個通用的演算法產生的,有arraylist,stack….提供了常用的容器,這種通用性是用萬能的object實現的;

特點就是:可以裝各個型別

(這違背了陣列單一化原則,除非迫不得已,千萬不要這麼做),存在型別不安全因素,效能差勁!

針對此,出現了自定義的加強版的集合-----強型別集合,它解決了安全性,但是通用性差,效能低。

由此可年,通吃各種型別到成了唯一的特點,除非迫不得已,不要用。

【泛型集合】於是,除了有靈活性和通用性特點外,安全和高效的集合便誕生了,同時,泛型的概念也推廣話了

在自定義泛型集合中,引出了約束佔位符型別的語法規則,要了解一下!

泛型思考,泛型是一種思想,主要體現在演算法上,它最大特點就是在不犧牲效率的前提下實現演算法的通用性-----真正實現**的重用,其抽象級別要比物件導向高;泛型是面向演算法(過程)程式設計,脫離資料,實現演算法(模式)的重用性;物件導向是面向大型軟體的程式設計,封裝資料和演算法,通過繼承和組合實現元件(**)的可重用性。

泛型類、泛型介面、泛型**、泛型方法;

泛型類相比類而言,更抽象,跟應該體現在演算法和資料容器的作用,除此以外,慎用泛型,它並不是萬能的!

泛型介面相比介面而言,更體現介面約定的抽象性

泛型**更能體現方法型別的抽象性

泛型方法更能體現演算法的抽象性,泛型方法能實現的演算法,一定能用函式過載實現,而函式的過載不一定能用泛型方法實現,最重要的是泛型方法內不允許有佔位符型別參與各種運算操作,這大大限制了泛型的功能。

總結:泛型型別是定義時用佔位符,

佔位符只能出現在泛型型別定義內或泛型方法內

C 深入研究ArrayList動態陣列自動擴容原理

1void test1 29 console.writeline count arraylist.count 10 console.writeline capacity arraylist.capacity 11 1 static void main string args 2 新建乙個test 類...

陣列深入研究

一 稀疏陣列 稀疏素組就是包含從0個開始的不連續陣列。通常,陣列的length屬性值代表陣列中元素的個數。如果陣列是稀疏,length屬性值大於素數的個數。可以用array 建構函式或簡單地指定陣列的索引值大於當前的陣列長度來建立稀疏陣列。注意 當在陣列直接量中省略值時不會建立稀疏陣列。省略的元素在...

演算法 C 陣列去除重複元素演算法研究

可以在網上找到的 string stringarray list用於儲存從陣列裡取出來的不相同的元素 list string liststring new list string foreach string eachstring instringarray 最後從list裡取出各個字串進行操作 f...