黑馬程式設計師 泛型知識點 總結

2021-06-19 13:38:13 字數 3586 閱讀 6323

----------------------

asp.net+android+ios開發、

.net培訓、期待與您交流! ----------------------

1.泛型,為了適應通用程式設計,我們可以使用型別引數,利用特定的型別,定義我們需要的類。泛型就是乙個抽象層,是型別的模板,用它定義具體的型別,才能例項化對外...

2.c#提供5種泛型:類、結構、介面、委託和方法。注意前面4個是型別,而方法是成員。

3.建立和使用常規的。非泛型的類的過程中有兩個步驟:宣告建立類並建立類的例項。但是泛型類不是實際的類,而是類的模板,所以我們必須先從它們構建實際的類型別,然後建立這個構建後的類型別。

4.宣告泛型類:

在類名之後放置一組尖括號。

在尖括號中用逗號分隔的佔位符字串來表示希望提供的型別。這被叫做型別引數。

在泛型類宣告的主體中使用型別引數來表示應該被替代的型別。

例如:class someclass

5.使用泛型類:

someclassmysc1 = new someclass();

someclassmysc1 = new someclass();

<>中的型別引數要使用真實型別代替.

6.型別引數的約束:

約束使用where子句列出。

每乙個有線束的型別引數有自己的where子句。如果形參有多個約束,它們在where子句中使用逗號分隔。

有關where子句的要點:

它們在型別引數列表的關閉尖括號之後列出。它們不使用逗號或其他符號分隔。它們可以以任何次序列出。

示例:class myclass

where t2:customer  //只有customer型別或從customer繼承的型別的類才能用作t2的實參,

where t3:icomparable //只有實現icomparable介面的類才能用於型別實參。

7.約束型別次序:

共有五種型別的約束,如下。

約束型別  描述

類名  只有這個型別的類或從它繼承的類才能用作型別實參

class  任何引用型別,包括類、陣列、委託和介面都可以用作實參 

struct  任何值型別都可以被用作型別實參

inte***cename 只有這個介面或實現這個介面的型別才能用作實參。

new()  任何帶有無參公共建構函式的型別都可以用作實參。這叫作建構函式約束

where子句可以任何次序列出。然而,where子句中的約束必須有特定的順序,如下。

最多只能有乙個主約束,如果有則必須放在第一們。(類名,class,struct是主約束)

可以有任意多的inte***cename約束。

如果存在構造數約束,則必須放在最後。

8.泛型方法。

泛型方法有兩個引數列表。封閉在圓括號內的方法引數列表,封閉在尖括號內的型別引數列表。

宣告泛型方法,需要在方法名稱之後和方法引數這前放型別引數列表;在方法引數列表後放可選的約束子句

public void printdata(s p, t t)where s:person

在呼叫泛型方法,應該在方法呼叫時提供型別實參,如:

mymethod();

mymethod();

型別推斷

int myint = 5;

mymethod(myint); //由於編譯器可以從方法引數中推斷型別引數,

mymethod(myint);      //我們可以省略這樣寫

9.擴充套件方法和泛型類。

擴充套件方法出可以和泛型結合使用,它允許我們將類中的靜態方法關聯到不同的泛型類上。

泛型類的擴充套件方法:

必須宣告為public static;

必須是靜態類的成員;

第乙個引數型別中必須有關鍵字詞this,後面是擴充套件的泛型類的名字。

10.泛型結構

與泛型類相似,泛型結構可以有型別引數和約束。泛型結構的規則和條件與泛型類是一樣的。

11.泛型委託,在委託名稱後、委託引數列表之前的尖括號中放型別引數列表。

deledate r mydelegate(t value); //注意,在這裡有兩個引數列表:委託形參列表和型別引數列表。

型別引數的範圍包括:返回值、形參列表、約束子句。

示例:delegate void mydelegate(t value);

class ******

static public void printupperstring(string s)

}class program

}12.泛型介面。

介面也有泛型介面,泛型介面允許我們編寫引數的介面成員返回型別是泛型型別引數的介面。泛型介面的宣告和非泛型介面的宣告差不多,

inte***ce imyifc

class ******:imyifc

我們也可以在非泛型型別中實現泛型介面。

inte***ce imyifc

class ****** :imyifc,imyifc

泛型介面的實現必須唯一。實現泛型型別介面時,必須保證型別實參組合不會在型別中產生兩個重複的介面。

inte***ce imyifc

class ******:imyifc,imyifc//錯誤,如果s是int型別將會和第乙個介面發生衝突。

12.泛型協變和逆變

先看乙個例子:

class animal

class dog : animal

delegate t factory();

class program

static void main(string args)

}由派生型別構造的委託賦值給由基礎型別構造的委託,為什麼編譯會給錯誤呢。答:問題在於儘管dog是animal的派生類,但委託factory沒有從委託factory派生。

我們執行animalmaker委託,呼叫**就希望返回乙個animal物件的引用,如果返回指向dog物件的引用也應該完全可以,因為根據賦值相容性,指向dog的引用就是指向animal 的引用。

如果派生類只是用於輸出值,那麼這種結構化的委託有效性之間的常關係叫做協變。在c#4.0中使用關鍵字標記委託宣告中的型別引數。

delegate t factory();

這是逆變:

class animal

class dog : animal

delegate void actionl(t a);

class program

static void main(string args)

static void main(string args)

}不需要in/out關鍵字實現協變和逆變的隱式強制轉換在c#4.0之前就有了。

有關變化的其他一些重要事項如下:

1.變化處理的是使用派生類替換基類的安全情況,反之亦然。因此變化只適用於引用型別,因為值型別不可以派生。

2.顯式變化使用in和out關鍵字只適用於委託和介面,不適用於類、結構和方法。

3.不包括in和out關鍵字型別引數的委託和介面叫做不變,這些型別引數不能用協變或逆變。

----------------------

asp.net+android+ios開發、

.net培訓、期待與您交流! ----------------------

黑馬程式設計師 泛型

泛型定義在類上 class utlis 物件,方法 泛型定義在方法上 public void print 泛型定義在類上和定義在方法上的 區別?泛型定義在類上,想要呼叫同一種方法,不同型別或不同方法的不同型別,要new多次不同型別的類。泛型定義在方法上,想要呼叫同一種方法,不同型別或不同方法的不同型...

黑馬程式設計師 泛型集合

把任何型別物件通過add object obj 放入list中,認為只是object型別 通過get int index 取出list中元素時必須進行強制型別轉換,繁瑣而且容易出現異常 使用map的put object key,object value 和get object key 訪問物件時存在...

黑馬程式設計師 泛型基礎

泛型 主要思想就是將演算法從資料結構中抽象出來,使得預定義的操作能夠作用於不同的型別,從而提高城鄉的效率 通用性和型別安全性,進而簡化整個程式設計模型。1 為何使用泛型 例項多個過載方法 public static void swap ref int x,ref int y public stati...