最顯著的一點就是它引數化了型別,把型別作為引數抽象出來,從而使我們在實際的運用當中能夠更好的實現**的重複利用,同時它提供了更強的型別安全,更高的效率,不過在約束方面,它只支援顯示的約束,這樣在靈活性方面就顯得不是那麼好了。我覺得它之所以能夠提供更高的效率是因為泛型在例項化的時候採用了 "on-demand"的模式,即按需例項化,發生在jit(just in time)編譯時。
下面來看如何定義乙個泛型類,很簡單,你只需要意識到一點,在這裡,型別已經被引數化了:
using system;
using system.collections.generic;
using system.text;
namespace generictest }
/**
/// 定義乙個泛型類,該類有兩個型別引數,分別是t,s
///
///
/// 型別引數
/// 型別引數
public class test
public void setvalue() }
} 上面的例子不是很恰當,目的是讓初學泛型的你了解一下泛型的定義及例項化方法,如上,我們定義了乙個泛型類,那麼如何實現泛型類的繼承呢?這裡需要滿足下面兩點中的任何一點即可:
1、泛型類繼承中,父類的型別引數已被例項化,這種情況下子類不一定必須是泛型類;
2、父類的型別引數沒有被例項化,但**於子類,也就是說父類和子類都是泛型類,並且二者有相同的型別引數;
//如果這樣寫的話,顯然會報找不到型別t,s的錯誤
public class testchild : test
//正確的寫法應該是
public class testchild : test
public class testchild : test
public class testchild : test
接著我們來看看泛型介面,其建立以及繼承規則和上面說的泛型類是一樣的,看下面的**:
public inte***ce ilist
public inte***ce idictionary
// 泛型介面的型別引數要麼已例項化
// 要麼**於實現類宣告的型別引數
class list : ilist, idictionary
public void add(int index, t value)
{} }
在來看一下泛型委託,首先我們定義乙個型別引數為t的委託,然後在類中利用委託呼叫方法:
using system;
using system.collections.generic;
using system.text;
namespace generictest
static string g(string s)
static void main(string args) }
} 我們再來看泛型方法,c#的泛型機制只支援在方法申明上包含型別引數,也即是泛型方法。特別注意的是,泛型不支援在除了方法以外的其他類/介面成員上使用型別引數,但這些成員可以被包含在泛型型別中,並且可以使用泛型型別的型別引數。還有一點需要說的就是,泛型方法可以在泛型型別中,也可以存在於非泛型型別中。下面我們分別看一下泛型型別的申明,呼叫,過載和覆蓋。
using system;
using system.collections.generic;
using system.text;
namespace generictest
//呼叫泛型方法
//注意:在呼叫泛型方法時,對泛型方法的型別引數例項化
public int usemethod()
//過載getvalue方法
public int getvalue(int i) }
//下面演示覆蓋
//要注意的是,泛型方法被覆蓋時,約束被預設繼承,不需要重新指定約束關係
abstract class parent
class child : parent }
} 最後我們來看一下泛型中的約束:
c#中的泛型只支援顯示的約束,因為這樣才能保證c#所要求的型別安全,但顯示的約束並非時必須的,如果不加約束,泛型型別引數將只能訪問system.object型別中的公有方法。「顯式約束」由 where子句表達,可以指定「基類約束」,「介面約束」,「構造器約束」,「值型別/引用型別約束」共四種約束。下面的例子**於李建忠老師的講座 ppt。
1、基類約束:
class a }
class b }
class c
where s: a // s繼承自a
where t: b // t繼承自b
2、介面約束
inte***ce iprintable
inte***ce icomparable
inte***ce ikeyprovider
class dictionary
where k: icomparable
where v: iprintable, ikeyprovider
3、構造器約束
class a }
class b }
class c
where t : new()
c c=new c(); //可以,a有無參構造器
c c=new c(); //錯誤,b沒有無參構造器
4、值/引用型別約束
public struct a
public class b
class c
where t : struct
c c=new c(); //可以,a是乙個值型別
c c=new c(); //錯誤,b是乙個引用型別
程式設計師特區
c 2 0泛型學習 一
1using system 23public class stack 410 public stack int size 11 15 public void push object item 16 23 public object pop 24 30 else 31 35 36 37 2.使用泛型的...
C 2 0之細說泛型
在c 1中,arraylist總是會給人帶來困擾,因為它的引數型別是object,這就讓開發者無法把握集合中都有哪些型別的資料。如果對string型別的資料進行算術操作那自然會報錯,但是遺憾的是在編譯期不會給你任何的提示 c 2中引入的泛型極其耀眼,甚至有些人會因為泛型而忽略c 2中其它新加入的特性...
C 2 0泛型介紹之簡單泛型類。
下面是乙個簡單的泛型類。public class genericclass f,t public genericclass f name,t age public f name set public t age set 這是乙個最簡單的泛型類了。f,t就是就是型別引數。可以是乙個物件,也可以是某種資...