JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » .Net Framework  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to postflat modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 更鋒利的C# 2.0 [精華]
ray_linn

什么都不懂的小白

版主

發文: 540
積分: 10
於 2004-02-03 08:57 user profilesend a private message to usersend email to ray_linnreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
一、泛型
先這個Stack類的實現。Stack類將它的資料存放在一個object陣列中,而它的兩個方法,Push和Pop,分別使用object來接受和返回資料:
1
2
3
4
5
6
7
public class Stack
{
object[] items;
int count;
public void Push(object item) {...}
public object Pop() {...}
}

它的缺點是,你可以向堆疊中壓入任何類型的值,然而,重新取回一個值得時候,必須將Pop方法返回的值顯式地轉換爲合適的類型,書寫這些轉換變更要提防運行時類型檢查錯誤是很乏味的。而且裝箱和拆箱操作增加了執行的負擔,因爲它帶來了動態記憶體分配和運行時類型檢查。
Stack類的另外一個問題是無法強制堆疊中的資料的種類。確實,一個Customer實例可以被壓入棧中,而在取回它的時候會意外地轉換成一個錯誤的類型:
1
2
3
Stack stack = new Stack();
stack.Push(new Customer());
string s = (string)stack.Pop(); //InvalidCastException

這段代碼從技術上來說是正確的,並且不會發生編譯期間錯誤。爲題知道這段代碼運行的時候才會出現,這時會抛出一個InvalidCastException異常。

泛型提供了一個技巧來建立帶有類型參數(type parameters)的類型。下面的例子聲明瞭一個帶有類型參數T的泛型Stack類。類型參數由類名字後面的定界符“<”和“>”指定。通過某種類型建立的Stack<T>的實例 可以無需轉換地接受該種類型的資料,這強過於與object相互裝換。類型參數T扮演一個占位符的角色,直到使用時指定了一個實際的類型。注意T相當於內部陣列的資料類型、Push方法接受的參數類型和Pop方法的返回值類型:
1
2
3
4
5
6
7
public class Stack<T>
{
T[] items;
int count;
public void Push(T item) {...}
public T Pop() {...}
}

使用泛型類Stack<T>時,需要指定實際的類型來替代T。下面的例子中,指定int作爲參數類型T:
1
2
3
Stack<int> stack = new Stack<int>();
stack.Push(3);
int x = stack.Pop();

Stack<int>類型稱爲已構造類型(constructed type)。在Stack<int>類型中出現的所有T被替換爲類型參數int。當一個Stack<int>的實例被創建時,items陣列的本地存貯是int[]而不是object[],這提供了一個實質的存貯,效率要高過非泛型的Stack。同樣,Stack<int>中的Push和Pop方法只操作int值,如果向堆疊中壓入其他類型的值將會得到編譯期間的錯誤,而且取回一個值時不必將它顯示轉換爲原類型。

泛型可以提供強類型,這意味著例如向一個Customer物件的堆疊上壓入一個int將會産生錯誤。這是因爲Stack<int>只能操作int值,而Stack<Customer>也只能操作Customer物件。下面例子中的最後兩行會導致編譯器報錯:
1
2
3
4
5
Stack<Customer> stack = new Stack<Customer>();
stack.Push(new Customer());
Customer c = stack.Pop();
stack.Push(3); // 類型不匹配錯誤
int x = stack.Pop(); // 類型不匹配錯誤

泛型類型的聲明允許任意數目的類型參數。上面的Stack<T>例子只有一個類型參數,但一個泛型的Dictionary類可能有兩個類型參數,一個是鍵的類型另一個是值的類型:
1
2
3
4
5
public class Dictionary<K,V>
{
public void Add(K key, V value) {...}
public V this[K key] {...}
}

使用Dictionary<K,V>時,需要提供兩個類型參數:
1
2
3
Dictionary<string,Customer> dict = new Dictionary<string,Customer>();
dict.Add("Peter", new Customer());
Customer c = dict["Peter"];


結語:泛型允許類、結構、介面、委託和方法通過它們所存貯和操作的資料的類型來參數化。泛型是很有用的,因爲它提供了更爲強大的編譯期間類型檢查,需要更少的資料類型之間的顯式轉換,並且減少了對裝箱操作的需要和運行時的類型檢查。


ray_linn edited on 2004-02-03 09:07
reply to postreply to post
飞翔的候鸟
話題樹型展開
人氣 標題 作者 字數 發文時間
14096 [精華] 更鋒利的C# 2.0 ray_linn 2251 2004-02-03 08:57
11529 Re:更鋒利的C# 2.0 popcorny 167 2004-02-03 10:15
12037 Re:更鋒利的C# 2.0 ray_linn 4549 2004-02-03 11:07
12307 Re:更鋒利的C# 2.0 ray_linn 5523 2004-02-03 14:26
11530 Re:更鋒利的C# 2.0 ray_linn 2255 2004-02-03 14:34
11419 Re:更鋒利的C# 2.0 ray_linn 20 2004-02-03 14:37
12710 Re:更鋒利的C# 2.0 payaqa 63 2004-02-06 22:03
» JWorld@TW »  .Net Framework

reply to postflat modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8