四 泛型(第二部分)

2022-07-26 07:06:09 字數 3077 閱讀 3456

.net自從2.0版本開始就支援泛型。泛型不僅是c#程式語言的一部分,而且與程式集中的il(中間語言)**緊密地整合。有了泛型,就可以建立獨立於被包含型別的類和方法了。我們不必給不同的型別編寫功能相同的許多方法或類,只建立乙個方法或類即可。

另乙個減少**的選項是使用object類,但obejct類不是型別安全的。泛型類使用泛型型別,並可以根據需要用特定的型別替換泛型型別。這就保證了型別安全性:如果某個型別不支援泛型類,編譯器就會出現錯誤。

泛型不僅限於類,本章還將介紹用於介面和方法的泛型。

泛型並不是乙個全新的結構,其它語言中有類似的概念。例如,c++模版就與泛型相似。但是c++模版和.net泛型之前有乙個很大的區別。對於c++模版,在用特定的型別例項化模版時,需要模版的源**。相反,泛型不僅是c#的一種結構,而且是clr定義的。所以,即使泛型類是在c#中定義的,也可以在visual basic中用乙個特定的型別例項化該泛型。

下面幾節介紹泛型的優點和缺點:

泛型的乙個主要有點是效能。

值型別儲存在棧上,引用型別儲存在堆上。c#類是引用型別,結構是值型別。.net很容易把值型別轉換為引用型別,所以可以在需要物件(物件是引用型別)的任意地方使用值型別。例如,int可以賦予乙個物件。從值型別轉換為引用型別稱為封箱。如果方法需要把乙個物件作為引數,同時傳遞乙個值型別,裝箱操作就會自動進行。另一方面,裝箱的值型別可以使用拆箱操作轉換為值型別。在拆箱時,需要使用型別強制轉換運算子。

下面的例子顯示了system.collections名稱控制項中的arraylist類。arraylist儲存物件,add()方法定義為需要把乙個物件作為引數,所以要裝箱乙個整數型別。在讀取arraylist中的值時,要進行拆箱,把物件轉換為整數型別。可以使用型別強制轉換運算子把arraylist集合的第乙個元素賦予變數il,在訪問int型別的變數i2的foreach語句中,也要使用型別強制轉換運算子:

using

system;

using

system.collections;

using

system.collections.generic;

using

system.linq;

using

system.text;

using

system.threading.tasks;

namespace

console.readkey();}}

}

裝箱和拆箱操作很容易使用,但效能損失比較大,遍歷許多項時尤其如此。

system.collections.generic命名空間中的list類不使用物件,而是在使用時定義型別。在下面的例子中,list類的泛型型別定義為int,所以int型別在jit編譯器動態生成的類中使用,不再進行裝箱和拆箱操作:

using

system;

using

system.collections;

using

system.collections.generic;

using

system.linq;

using

system.text;

using

system.threading.tasks;

namespace

console.readkey();}}

}

泛型的另乙個特性就是型別安全。與arraylist類一樣,如果使用物件,就可以在這個集合中新增任意型別。下面的例子在arraylist型別的集合中新增乙個整數、乙個字串和乙個myclass型別的物件。

如果這個集合使用下面的foreach語句迭代,而該foreach語句使用整數元素來迭代,編譯器就會編譯這段**。但並不是集合中的所有元素都可以強制轉換為int,所以會出現乙個執行異常。

錯誤應該盡早的發現。在泛型類list中,泛型型別t定義了允許使用的型別。有了list的定義,就只能把整數型別新增到集合中。編譯器就不會編譯這段**,因為add()方法的引數無效。

using

system;

using

system.collections;

using

system.collections.generic;

using

system.linq;

using

system.text;

using

system.threading.tasks;

namespace

class

program

var mylist2 = new list();

mylist2.add(

111);

mylist2.add(

"dean mcgrady");

mylist2.add(

newmyclass());

console.readkey();}}

}

泛型允許更好地重用二進位制**。泛型類可以定義一次,並且可以用許多不同的型別例項化。不需要像c++模版那樣訪問源**。

例如,system.collections.generic命名空間中的list類用乙個int、乙個字串和乙個myclass型別例項化:

using

system;

using

system.collections;

using

system.collections.generic;

using

system.linq;

using

system.text;

using

system.threading.tasks;

namespace

class

program

}}

如果在程式中使用泛型,在區分泛型型別和非泛型型別時就會有一定的幫助。下面是泛型型別的命名規則:

*泛型型別的名稱用字母t作為字首。

*如果沒有特殊的要求,泛型型別允許用任意類替代,且只使用了乙個泛型型別,就可以用字元t作為泛型型別的名稱。

*如果泛型型別有特定的要求(例如,它必須實現乙個介面或派生自基類),或者使用了兩個或多個泛型型別,就應給泛型型別使用描述性的名稱。

Web API 第二部分

web api 第二部分 元素偏移量 offset element.offsettop element.offsetleft element.offsetwidth 可以得到元素的大小 寬度和高度 是包含padding border width element.offsetheight elemen...

redux 第二部分

redux 的使用方法,為什麼使用 action.js 檔案,進行優化 將其分開,然後我們通過工廠函式的每次返回不同的物件,由於引數是固定的,每次返回的都是事件型別和事件資料,所以我們可以使用乙個函式,通過其返回值來返回乙個物件,讓後傳遞給 action 我們的 reducer 函式有兩個引數,引數...

實驗二 第二部分

第二部分 ftp協議分析 1.兩個同學一組,a和b。2.在a主機上架設ftp伺服器 3.在b主機上執行wireshark,並登陸a主機的ftp伺服器,上傳一張,得到抓取的資料報,4.進行追蹤tcp流,顯示為原始資料,分析得到a主機登陸ftp的過程及使用者名稱密碼,還原上傳的,第二部分 ftp協議分析...