C 基礎筆記 泛型 Genericity

2022-08-30 20:30:16 字數 2579 閱讀 7875

一、概述

泛型並不是c#語音一開始就帶有的特性,而是在fcl2.0之後實現的新功能。

泛型是將型別引數化,以便於更大範圍的進行**復用。

二、泛型使用範圍及用法

1.總是優先考慮泛型

以list基本實現為例:

public

class mylist

set

}public

intcount

}}

我們可以把t理解成乙個佔位符,在c#泛型編譯生產il(中間**)中,t就是乙個佔位符的角色。在執行時,jit(即時編輯器)會用實際的**中輸入的t型別替換t。

這裡很多匠友會有疑問,為什麼不用object型別代替t?

原因有二:

其一object無法支援型別安全。

其二效率消耗,從object型別轉換成其他型別會帶來裝箱和拆箱的效能損耗。

2. 盡量避免在泛型型別中宣告static成員:

static

void main(string

args)

public

class mylist

public

mylist()

}

**輸出:21

實際上你為t指定不同的資料型別,他們之間是不共享靜態成員的。

注意:非泛型類中的泛型方法並不會在執行時的本地**中生產不同的型別。

3. 泛型約束

這裡的「約束」並非是限制引數,正好相反,「約束」讓泛型引數具有更多的行為和屬性。

public

class

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表示定義一組條件並判斷引數是否符合條件。

static

void main(string

args)

static

int add(int i, int

j)

static

void print(string

msg)

我們應該習慣在**中使用這類委託代替自己寫的委託宣告。

6. 使用lambda表示式代替方法和匿名方法

static

void main(string

args)

;action

print = (msg) =>;

print(add(

2, 5

).tostring());

console.read();

}

lambda表示式操作符「=>」的左側是方法引數,右側是方法體,其本質是匿名方法。我們應該在實際的編碼中熟練運用lambda表示式,避免寫出繁瑣而又不美觀的**。

7.小心閉包中的陷阱

static

void main(string

args)

;lists.add(t);

}foreach (action t in

lists)

console.read();

}

我們設計的意圖是讓匿名方法接收引數i,並輸出:

而實際輸出:

通過il檢視器可以模擬出如下**結果:

class

program

foreach (action t in

lists)

console.read();}}

class

tempclass

}

這樣一來,即使**執行後離開了原區域性變數i的作用域,包含該閉包物件的作用域也還存在。

要實現預期結果可以將壁報物件放在i的作用域內:

static

void 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 是一種語言機制,通過它可以實現乙個標準的容器庫。像類一樣,泛型也是一種抽象資料型別,但是泛型不屬於物件導向,它是物件導向的補充和發展。在物件導向程式設計中,當演算法與資料型別有關時,物件導向在對演算法的抽象描述方面存在一些缺陷。比...