現代程式員寫代碼沒有人敢說自己沒用過泛型,這個泛型模板T可以被任何你想要的類型替代,確實很魔法很神奇,很多人也習以為常了,但就是這麼有趣的泛型T底層到底是怎麼幫你實現的,不知道有多少人清楚底層玩法,這篇我就試著來分享一下,不一定全對哈。。。 一:沒有泛型前 現在的netcore 3.1和最新的.ne ...
現代程式員寫代碼沒有人敢說自己沒用過泛型,這個泛型模板T可以被任何你想要的類型替代,確實很魔法很神奇,很多人也習以為常了,但就是這麼有趣的泛型T底層到底是怎麼幫你實現的,不知道有多少人清楚底層玩法,這篇我就試著來分享一下,不一定全對哈。。。
一:沒有泛型前
現在的netcore 3.1和最新的.netframework8早已經沒有當初那個被人詬病的ArrayList了,但很巧這玩意不得不說,因為它決定了C#團隊痛改前非,拋棄過往重新上路,上一段ArrayList案例代碼。
public class ArrayList
{
private object[] items;
private int index = 0;
public ArrayList()
{
items = new object[10];
}
public void Add(object item)
{
items[index++] = item;
}
}
上面這段代碼,為了保證在Add中可以塞入各種類型 eg: int,double,class, 就想到了一個絕招用祖宗類object接收,這就引入了兩大問題,裝箱拆箱和類型安全。
1. 裝箱拆箱
這個很好理解,因為你使用了祖宗類,所以當你 Add
的時候塞入的是值類型的話,自然就有裝箱操作,比如下麵代碼:
ArrayList arrayList = new ArrayList();
arrayList.Add(3);
<1> 占用更大的空間
這個問題我準備用windbg看一下,相信大家知道一個int類型占用4個位元組,那裝箱到堆上是幾個位元組呢,好奇吧