程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#中的泛型程序設計總結

C#中的泛型程序設計總結

編輯:C#入門知識

今天總結了一下的C#泛型程序設計,就覺得其實C#中的所謂的泛型程序設計和C++中相對應的模版、

泛型設計的功能和機制是很相似的,在C++中有“函數模版 ”和“類模版 ”,而在C#中則有相應的“泛型方法”和“泛

型類”。

A:先說說“泛型方法”吧,C#中的泛型方法是指使用了類型參數的方法成員,

For example:

public static void Swap(ref T x,ref T y)
{
T tmp = x;
x = y;
y = tmp;
}

int a = 1;
int b = 2;
Swap(ref a,ref b);//調用泛型方法 顯示為參數類型指定具體類型

Swap( ref a,ref b);//調用泛型方法 由C#編譯器根據傳遞給方法的參數來自動判斷參數類型的具體類型。


同時在使用“泛型方法”時需要說明的幾點是:

一、泛型方法也可以對其參數類型進行類型限制其中包括:主要限制、次要限制、函數限制;(關於類型限制在後面的泛型類中詳解)

二、C#中是不允許對類的構造函數、屬性、事件、索引函數和操作符等特殊函數定義為泛型方法的。

三、泛型方法也可以被定義為虛擬方法、重載方法、抽象方法或密封方法等,泛型方法也可以實現override重載的,當然也能利用其

實現多態,還有一點就是在派生類中重載基類中的泛型方法時,會自動繼承基類中泛型方法的所有類型限制,沒有必要再去重新聲明一遍

四、泛型方法也是可以通過委托機制來調用的,其實現機制有兩種,分別是:“普通委托”和“泛型委托”,

For example:


public static void Swap(ref T x,ref T y)
{
T tmp = x;
x = y;
y = tmp;
}

public static void Clear(ref T x, ref T y)
{
x = default(T);
y = default(T);

}

普通委托:

public delegate void fun(ref int x, ref int y);

int a = 1;
int b = 2;

fun fun1 ;
fun1 = Swap;
fun1(ref a,ref b);


泛型委托:

public delegate void Fun(ref T x,ref T y);

Fun fun2;
fun2 = Swap;
fun2(ref a,ref b);


B:泛型類和泛型接口

For example:

class LinkNode
{
protected T data;
protected LinkNode next;
//沒有用指針實現鏈表而是直接用存儲下一個對象的方式構成了,鏈表結構。
public T Data {
get { return data; }
set { data = value; }
}
public LinkNode Next {
get { return next; }
set { next = value ; }
}


public LinkNode()//無參構造函數
{
//通過關鍵字default來獲取“抽象型”變量的默認值
data = default(T);
}
public LinkNode(T t)//帶參構造函數
{
data = t;
}
//向後移動n個節點
public static LinkNode operator>>(LinkNode node ,int n)
{
LinkNode node1 = new LinkNode() ;
node1 = node;
for (int i = 0; i {
node1 = node.next;
}
return node1;
}
public static bool operator==(LinkNode t1,LinkNode t2)
{
//return (t1.Data ==t2.Data);
//錯誤不能直接將比較符運用到未知類型的T類型中
//但是可以直接利用object類中的比較方法如Equals();
return (t1.Data.Equals(t2.Data));
}

有上面的這個例子可以看出在寫泛型類或泛型接口有幾點要注意的就是:

一、泛型類的構造函數名稱是與類名同名的,並不包括類型參數。

二、不能隨意的在泛型類中將比較符等運算符運用於類型參數的對象中,這樣是一定會報錯的,但是如果是運用object類中的相關方法則是行的。

三、在一個泛型類中是可以使用多個泛型參數的。

四、泛型類本身是不能擁有任何東西的,而只有泛型類的構造類型和其具體實例才能擁有成員方法或數據成員的。而在C#中泛型類中的靜態成

員則是屬於該泛型類的構造類型。

五、無論是在寫泛型類、泛型接口或泛型方法時都可以加上類型限制,即C#支持在泛型定義過程中通過where關鍵字來對類型參數進行限制,限制

方式主要包括:主要限制(可以限制為struct值類型或class引用類型)、次要限制(限制該類型參數必須從指定的基類或幾口繼承而來)、構造函數限制

(要求類型參數的目標類型必須提供一個無參的構造函數),我個人覺得這兒的類型限制其實在C#的程序設計中提供了極大的方便,這個是C++中的模版

所不能及的,但這也同時犧牲了一定的靈活性。

六、由泛型類所 引發的泛型類的繼承問題,在泛型類之間的繼承中有一條最基本的原則就是:“開放類型不能做為封閉類型的基類”,說白了也就是說

在普通類繼承泛型類時,非泛型的普通類是不能直接繼承自泛型類的,但能繼承自泛型類的封閉構造函數。我個人總結就是在繼承的過程中類的“開放性”

不能變小,但能不變或變大。


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved