一、概述
泛型並不是c#語音一開始就帶有的特性,而是在fcl2.0之後實現的新功能。
泛型是將型別引數化,以便於更大範圍的進行**復用。
二、泛型使用範圍及用法
1.總是優先考慮泛型
以list基本實現為例:
publicclass mylist
set
}public
intcount
}}
我們可以把t理解成乙個佔位符,在c#泛型編譯生產il(中間**)中,t就是乙個佔位符的角色。在執行時,jit(即時編輯器)會用實際的**中輸入的t型別替換t。
這裡很多匠友會有疑問,為什麼不用object型別代替t?
原因有二:
其一object無法支援型別安全。
其二效率消耗,從object型別轉換成其他型別會帶來裝箱和拆箱的效能損耗。
2. 盡量避免在泛型型別中宣告static成員:
staticvoid main(string
args)
public
class mylist
public
mylist()
}
**輸出:21
實際上你為t指定不同的資料型別,他們之間是不共享靜態成員的。
注意:非泛型類中的泛型方法並不會在執行時的本地**中生產不同的型別。
3. 泛型約束
這裡的「約束」並非是限制引數,正好相反,「約束」讓泛型引數具有更多的行為和屬性。
publicclass
salary
public
int bonus
}public
class
salarycompare
else
if (t1.basesalary ==t2.basesalary)
else
}}
以下是泛型指定那些約束:值型別,引用型別,無參公共構造方法等。
4. 泛型型別變數指定初始值
public t func()
5. fcl(框架類庫)中的委託宣告
action表示接受0個或者多個輸入引數,無返回值。
func表示接受0個或者多個輸入引數,帶返回值。
predicate表示定義一組條件並判斷引數是否符合條件。
staticvoid main(string
args)
static
int add(int i, int
j)
static
void print(string
msg)
我們應該習慣在**中使用這類委託代替自己寫的委託宣告。
6. 使用lambda表示式代替方法和匿名方法
staticvoid main(string
args)
;action
print = (msg) =>;
print(add(
2, 5
).tostring());
console.read();
}
lambda表示式操作符「=>」的左側是方法引數,右側是方法體,其本質是匿名方法。我們應該在實際的編碼中熟練運用lambda表示式,避免寫出繁瑣而又不美觀的**。
7.小心閉包中的陷阱
staticvoid main(string
args)
;lists.add(t);
}foreach (action t in
lists)
console.read();
}
我們設計的意圖是讓匿名方法接收引數i,並輸出:
而實際輸出:
通過il檢視器可以模擬出如下**結果:
classprogram
foreach (action t in
lists)
console.read();}}
class
tempclass
}
這樣一來,即使**執行後離開了原區域性變數i的作用域,包含該閉包物件的作用域也還存在。
要實現預期結果可以將壁報物件放在i的作用域內:
staticvoid main(string
args)
;lists.add(t);
}foreach (action t in
lists)
console.read();
}
實際輸出:
總結:泛型的優點是多方面的,無論是泛型類還是泛型方法都同時具備可重用性、型別安全和高效率等特性,這都是非泛型類和非泛型方法無法具備的。
在實際的程式設計過程中盡量使用最少最高效的**實現功能,這樣不僅讓你的**可讀性強也會看起來賞心悅目,好的**是會說話的,就算你不去注釋其他匠友也會讀懂它。
最近正在學習敏捷,希望沿著這條路繼續走下去,堅持、堅持、、
C 泛型基礎
泛型的基本思想 泛型程式設計 generic programming 是一種語言機制,通過它可以實現乙個標準的容器庫。像類一樣,泛型也是一種抽象資料型別,但是泛型不屬於物件導向,它是物件導向的補充和發展。在物件導向程式設計中,當演算法與資料型別有關時,物件導向在對演算法的抽象描述方面存在一些缺陷。比...
基礎 C 泛型
msdn 章節內容 ms help 泛型是 2.0 版 c 語言和公共語言執行庫 clr 中的乙個新功能。泛型將型別引數的概念引入 net framework,型別引數使得設計如下類和方法成為可能 這些類和方法將乙個或多個型別的指定推遲到客戶端 宣告並例項化該類或方法的時候。例如,通過使用泛型型別引...
C 泛型基礎
泛型的基本思想 泛型程式設計 generic programming 是一種語言機制,通過它可以實現乙個標準的容器庫。像類一樣,泛型也是一種抽象資料型別,但是泛型不屬於物件導向,它是物件導向的補充和發展。在物件導向程式設計中,當演算法與資料型別有關時,物件導向在對演算法的抽象描述方面存在一些缺陷。比...