淺析c#中的泛型
阿新 • • 發佈:2019-01-01
泛型是我們經常在程式設計中遇到的一種未確定的型別,在面嚮物件語言比如c#中,為了更好的滿足面向物件程式設計的要求,我們會經常用到泛型來解決一些問題。
我們最常用的就是List集合,List<T>我們常用來表示某種型別的集合,因為型別的可變性,所以就有了泛型的需要。
比如List<int>就表示int型別的集合,當我們不確定我們需要的是什麼型別的集合時,就可以用泛型來定義,我們可以看出,泛型更像是充當了一個佔位符的作用,將即將要填寫的型別的位置先佔住,然後當需要具體使用時,就將具體的類寫上去取代佔位符。
泛型的應用範圍非常廣泛,多數情況下,我們都會在面向物件程式設計中用到,尤其是涉及到程式的擴充套件性、程式的複用性,需要對一些類進行進一步的封裝,這時泛型就起到了非常靈活的作用。
舉個栗子:
classNormalRoom
{
public
string
name;
public
Normal
serve;
}
class
LowRoom
{
public
string
name;
public
Low serve;
}
class
HighRoom
{
public
string
name;
public
High serve;
}
比如我們有一個房間類,房間有一個屬性是服務,那麼服務可以是正常的服務,也可以是低質量的服務,或者高質量的服務,如果我們現在就要正常的服務,那麼OK,這個類沒有任何毛病,但是萬一有一天,我的需求發生了變化,我不要普通服務,我就要高質量的服務,那麼我們就需要再重新修改之前的類,將裡面的服務Normal進行修改,萬一哪一天我右有需求變化,我不要普通,不要高階,要豪華級,那我們必須再次編寫Room類,將裡面的Normal再次修改;我們會發現,這種簡單的類的定義是很難滿足多變的使用者需求,而且真正實戰中類的複雜程度會非常大,我們不可能採用一一修改裡面的引數型別來滿足我們變化著的需求,這時,我們便將這個型別暫定,不指定具體的,就在那裡佔個位置,你說普通服務,就將普通服務的類代替掉所佔的位置。所以我們就引入了泛型,引入後我們的程式碼可以進行一下優化
class
Room<T>
{
public
string
name;
public
T serve;
}
如果我們需要普通服務的房間,就只用例項普通的型別的房間,如果有其他需求也可以直接例項化:
class
Program
{
static
void
Main(string[] args)
{
//普通房間
Room<Normal>
roomN =
new
Room<Normal>();
//高階房間
Room<High>
roomH =
new
Room<High >();
//低階房間
Room<Low>
roomL =
new
Room<Low>();
}
}
這樣我們便可以非常輕鬆的進行房間質量的擴充套件,如果以後要新增豪華級房間,只需要自定義一個豪華級別類,然後對Room<Rich>進行例項化便可以達到目的。
同樣的思路,我們還可以定義泛型方法:
public
void
Serve<T>(T args)
{
//傳入對應的泛型引數
}
如果T是int,我們就需要傳入int型別的引數,如果是string,便需要傳入string型別引數
同理,我們還可以定義泛型委託:
public
delegate
T
MyDel<T>(T args);
使用方法都如出一轍,我們最常用的就是List<T>,Dictionary<T,R>,Queue<T>等等,在以後複雜的專案中我們會經常使用,所以泛型一定要學好,為以後面向物件程式設計提供更好的思路和方法!