一、 泛型類:建立和使用常規的、非泛型的類的過程中有兩個步驟:宣告類並建立類的例項泛型:更準確的使用一種以上的型別**方式 泛型允許我們宣告型別引數化的**,我們可以用不同的型別進行例項化
也就是說,我們可以用「型別佔位符」(型別引數)來宣告,然後在建立例項時提供真實型別
**泛型不是型別,而是型別的模板**
c#提供了5種泛型:類、結構、介面、委託和方法。前面四個是型別,方法是成員。
泛型類不是實際的類,而是類的模板。必須先構建實際的類型別,然後建立這個構建後的類型別的例項
宣告泛型類,構建真實的類型別,建立構建後的類型別的例項。
型別實參:替代型別引數的真實型別叫做型別實參
二、 型別引數約束:提供額外資訊讓編譯器知道引數可以接受那些型別的引數 ,這些額外的資訊叫做約束class program
;var stringarray = new
string ;
******class.reverseandprint(intarray); //呼叫泛型方法
******class.reverseandprint(intarray); // 可以根據變數推斷型別引數 簡化寫法
******class.reverseandprint(stringarray);
// 泛型類擴充套件
var int****** = new ******(3, 5, 7);
var string****** = new ******("a1", "a2", "a3");
int******.print(); // 呼叫執行 擴充套件類中的方法
string******.print();
console.readkey();}}
class mystack// 泛型類
}bool isstackempty
}public
void
push(t x) // 乙個方法 傳遞 乙個引數型別的形參
}public t pop() // 出棧
public
mystack()
public
void
print() // 遍歷列印陣列內容
", stackarray[i]);}}
}
約束使用where 子句列出
每乙個約束的型別引數有自己的where子句
如果形參有多個約束,它們在where子句中使用逗號分隔
where子句:在型別引數列表的關閉尖括號之後列出
在結尾不使用逗號或其他分隔符
可以以任何次序列出
where是上下文關鍵字,可以在其他上下文中使用
5中型別的約束和次序
類名:只有這個型別的類或從它繼承的類才能用作型別實參
class : 任何引用型別,包括類、陣列、委託和介面度可以用作實參
struct: 任何值型別都可以被用作型別實參
inte***cename:只有這個介面或實現這個介面的型別才能用作實參
new() :任何帶有無參公共建構函式的型別都可以用作實參,這叫做建構函式約束
where中的約束必須有特定的順序:最多只能有乙個主約束,如果 有則必須放在第一位
可以有任意多的inte***cename約束,如果存在建構函式約束,則必須放在最後
三、 泛型方法:泛型方法可以在泛型和非泛型類以及結構和介面中宣告//class linkedlist// 兩個型別引數
// where first:約束型別; 約束型別順序:類名--class--struct--inte***cename--new()
//
宣告泛型方法:在方法名引數列表後放可選的約束
在方法名稱之後和方法引數列表之前放型別引數列表
四、 擴充套件方法和泛型類class
******class
}}
這裡簡單描述下非泛型類的擴充套件:
1、宣告擴充套件方法的類必須宣告為static
2、擴充套件方法本身必須宣告為是static
3、擴充套件方法必須包含關鍵字this作為它的第乙個引數型別,並且在後面跟著它所擴充套件的類的名稱
泛型方法的擴充套件和方法擴充套件一樣
class
******
public t ergodic() // 遍歷列印
}static
class extend****** // 泛型類的擴充套件 靜態宣告類
}}
泛型 泛型類 泛型方法 泛型擦除
1 是什麼?一種允許我們在不確定引數型別時候使用的型別。例如我不知道a方法應該會傳string還是int,我就用個泛型先佔坑。2 為什麼要用泛型?泛型可以在編譯期自動確定具體型別,檢查型別是否匹配,可以提高 的重用率,減少冗餘編碼。3 泛型與object的區別?像上面說的我不知道方法a的引數型別,其...
泛型 (2)泛型類 泛型方法 泛型介面
一 泛型類 定義person類 package cn.itcast.p2.bean public class person implements comparable public person string name,int age public int compareto person p ov...
泛型 泛型簡介和泛型類
在泛型引入之前,如果我們需要產生多個物件,每個物件的邏輯完全一樣,只是物件內的成員變數的型別不同,那麼我們只能建立多個類檔案,給每個類的成員變數設定不同的資料型別。這麼做會導致類的膨脹,重用性太差。一種方式是對將object作為變數型別,但是需要對獲取的資料進行強制型別轉換,這個過程可能導致型別轉換...