第十二章 泛型

2022-02-06 10:08:06 字數 1362 閱讀 6576

源**保護

型別安全

更加清晰的**

更佳的效能.(減少裝箱和拆箱的操作)

c++的標準模板庫的部分集合類

開放型別和封閉型別
乙個泛型的所有型別實參傳遞的都是實際的資料型別,則成為封閉型別.

具有泛型型別引數的型別成為開放型別,clr禁止構造開放型別的例項.類似禁止構造介面例項.

如:var t=typeof(dictionary<,>); var o=createinstance(t);這樣是不行的.需要制定型別之後在構造.

clr會為型別物件分配靜態字段,對於泛型,list和list,有各自的靜態字段,是獨立的.

如果乙個程式集中使用 了list,clr只會為這個型別編譯一次**,乙個完全不同的程式集載入進來的時候,也會使用這同乙個編譯過的**.同時,clr認為引用型別實參是完全相同的,clr為list方法編譯的**可以直接用於list的方法.因為string和stream均未引用型別,都是指向堆上的物件的指標.值型別則是專門生產本地**.

逆變和諧變
in 逆變 意味著泛型型別引數可以從乙個街壘更改為派生類

out協變 意味著泛型型別引數可以從乙個派生類改為基類

如:public delegate tresult func

funcfn1=null;

可以轉型為func

泛型方法
clr允許乙個方法指定他獨有的型別實參

如:public class customorder

}

泛型方法和型別推斷
為了增強使用泛型時的可讀性,c#編譯器支援泛型型別推斷,如:可以推斷出value的型別.

public class customorder

}public class usetest

}

泛型型別的可驗證問題
對於泛型型別,可以使用default(t),會初始化為null,或0.不能夠直接設為null,如t s=null,是不行的,因為值型別是不能設為null的,除非t加了限定是引用型別.

直接對泛型型別進行強猴子轉換也是不行的,如t value, var t=(int)value,是錯誤的.可以這樣var t=(int)(object)value,但是雖然能通過編譯,但很可能出錯.

泛型變數,和null進行比較,如果為值型別,則永遠為false.

不能直接對泛型引數用==比較,除非t被約束為class.

第十二章 泛型演算法 (上)

在使用標準庫當中的演算法時,記得要包含 include標頭檔案,在學習演算法的時候個人感覺主要了解到演算法實現的功能和他所需要的引數即可使用演算法了。下面主要介紹課本中提到的標準庫演算法 1.唯讀演算法 find和accumulate演算法 該演算法在 include標頭檔案中 accumulate...

第十二章 檔案

文字檔案 文字檔案是一種由若干字元構成的檔案,可以用文字編輯器進行閱讀或編輯。以txt py html等為字尾的檔案都是文字檔案。2.二進位制檔案 二進位制檔案一般是指不能用文字編輯器閱讀或編輯的檔案。以 mp4 png等為字尾的檔案都是二進位制檔案,如果想要開啟或修改這些檔案,必須通過特定軟體進行...

第十二章 dp

動態規劃策略 將原始問題拆分為多個子問題,將子問題結果記錄,方便復用子問題的解 遞迴 記憶化 遞推 是動態規劃的一體兩面,本質都是一樣的 遞推減少了呼叫次數,空間上還能優化,一般選擇遞推方式 遞迴 記憶化 int memo maxn 將o 2 n o n intfibonacci int n 遞推 ...