c 高階學習 泛型

2021-09-28 15:27:21 字數 1310 閱讀 2154

我們為什麼要用泛型?簡而言之是為了提高**的泛用性,所以才存在的。假設我需要處理十個類,並且對十個類處理的方法都一樣,如果沒有泛型的話那麼我們需要定義十個方法來處理不同的類,你或許可以將方法中公用的部分提取出來,但是宣告十個方法是不可避免的,但是有了泛型就不一樣了,我們可以將十個方法變為乙個方法,大大的簡化了開發的步驟。

方法的建立

static bool compare(t first, t second) where t:class

else

}

在普通的方法後加上《泛型名稱》宣告乙個帶泛型引數的方法,泛型類可作為輸入和輸出的型別使用。泛型可以設定泛型約束條件來作為泛型的規範,語法為 方法後加 where 泛型名稱:約束條件,上面的**中泛型必須為乙個class,基礎的泛型條件除了class還有struct,stream,idisposable等,約束new()會檢查型別實參是否有乙個可用於建立型別示例的無引數建構函式,此外約束還可以是其他自定義的類,這樣做泛型引數就必須是類本身或者該類的子類。 泛型可一次性宣告多個,並且每個泛型型別也可以繫結多個不互相衝突的約束條件。

操作如下:

class father

class child:father

class child2 : father

class 泛型

static void main(string args)

}

輸出:

此外我們還能夠使用system.activator.createinstance()對泛型來進行例項化操作與使用:

private static listgettlist(int num)

return tlist;

}static void main(string args)

輸出:

甚至可以利用反射來對例項化之後的泛型進行賦值操作,以下是datatable對與其相應泛型的list的轉化。

public static void getmodelist(datatable dtdata, out listmodelist) where t:base

mode.gettype().getfield(dcdata.columnname.tolower()).setvalue(mode, convert.changetype(drdata[dcdata.columnname], (tp == typeof(double?))?typeof(double):tp));

}modelist.add(mode);}}

C 高階 泛型

在沒有泛型的時候,我們想要讓方法接受多種型別的引數,在.net framwork 1.0時代我們會這樣定義乙個方法 public void myaction object myparameter else if myparameter.gettype typeof long else 呼叫 int ...

C 泛型學習

注意push 方法 1.public class stack public void push t item public stack int i stackss new stack 100 ss.push ds 第一種,ss.push ds 編譯通不過,因為 引數t 的型別 必須與 類例項化時定義...

《C 高階程式設計》之泛型 1建立泛型類

net自從2.0版本開始就支援泛型。閒話休提,馬上來看下非泛型的簡化鍊錶類,它可以包含任意型別的物件。linkedlistnode.cs中 在鍊錶中,乙個元素引用另乙個元素,所以必須建立乙個類,將其封裝在鍊錶中,並引用下乙個物件。1 public class linkedlistnode27 8pu...