ASP.NET泛型一之泛型簡介與基本語法
".NET泛型"系列:
ASP.NET泛型三之使用協(xié)變和逆變實現(xiàn)類型轉(zhuǎn)換
ASP.NET泛型四之使用Lazy<T>實現(xiàn)延遲加載
.NET泛型或許是借鑒于C++泛型模版,借助它可以實現(xiàn)對類型的抽象化、泛型處理,實現(xiàn)了類型和方法之間的解耦。一個最經(jīng)典的運用是在三層架構中,針對不同的領域模型,在基接口、基類中實現(xiàn)針對各個領域模型的泛型處理。
為什么需要泛型
不用泛型
來看一個比較類型的方法。
public class Calculator
{
public static bool AreEqual(int value1, int value2)
{
return value1 == value2;
}
}在客戶端調(diào)用。
class Program
{
static void Main(string[] args)
{
bool result = Calculator.AreEqual(1, 2);
if (result)
{
Console.WriteLine("相等");
}
else
{
Console.WriteLine("不等");
}
Console.ReadKey();
}
}運行結果:不等
不用泛型的缺點一:不是類型安全
如果我們想使用現(xiàn)在的方法來比較字符串類型。
bool result = Calculator.AreEqual("A", "B");這時,看到編譯器報錯。從這點來看,AreEqual()方法不是類型安全的方法,當輸入string類型,編譯器就會報錯。
如果把AreEqual()方法的參數(shù)類型改成object,編譯器就不再報錯。
public class Calculator
{
public static bool AreEqual(object value1, object value2)
{
return value1 == value2;
}
}以上,運行也正常。
不用泛型的缺點二:裝箱與拆箱導致性能降低
現(xiàn)在,對于AreEqual(object value1, object value2),從方法本身來講是沒有問題的,但在客戶端調(diào)用的時候,比如我們還是想比較值類型。
bool result = Calculator.AreEqual(1, 2);
在運行時,當整型值類型參數(shù)1和2傳遞、賦值給AreEqual(object value1, object value2)中的引用類型參數(shù)value1和value2的時候,發(fā)生了一次"裝箱"操作。而當把引用類型轉(zhuǎn)換成值類型的時候,又會發(fā)生一次"拆箱"操作,這導致性能的降低。
使用泛型
把AreEqual()改成泛型方法。
public class Calculator
{
public static bool AreEqual<T>(T value1, T value2)
{
return value1.Equals(value2);
}
}于是,在客戶端可以這樣:
bool result = Calculator.AreEqual<string>("A", "A");
bool result = Calculator.AreEqual<int>(5, 3);由此,使用泛型的好處有:
1、實現(xiàn)了方法和類型的解耦。
2、不會造成類型轉(zhuǎn)換,規(guī)避了因裝箱于拆箱引起的性能問題。
3、泛型保證了類型的絕對安全。
當然,還可以把T的位置放在類上:
public class Calculator<T>
{
public static bool AreEqual(T value1, T value2)
{
return value1.Equals(value2);
}
}然后這樣使用:
bool result = Calculator<string>.AreEqual("A", "A");
bool result = Calculator<int.AreEqual(1, 2);泛型的運行時本質(zhì)
CLR中有專門的IL指令支持泛型操作。
→初次編譯時,生成IL代碼和元數(shù)據(jù),T只是類型占位符,在編譯時不進行實例化
→JIT編譯時,以實際類型替換元數(shù)據(jù)中的T占位符
→將元數(shù)據(jù)轉(zhuǎn)換為本地代碼
泛型語法
class MyArray<T> where T : Student, new()
{
private T[] _items;
public T myData;
public MyArray()
{
myData = default(T);
}
public void Add(T item)
{}
}創(chuàng)建泛型實例要指定實際的數(shù)據(jù)類型:
MyArray<Int32> myArr = new MyArray<Int32>();
值類型的默認值為0,引用類型的默認值為null,使用泛型默認值:
myData = default(T);
泛型約束:
- T : 基類名,表示必須是基類名的派生類
- T :new(), 表示必須具有無參構造函數(shù),new()約束必須放在最后面
- T :struct, 表示必須是值類型
- T :class, 表示必須是引用類型
- T :接口名,表示必須實現(xiàn)該接口,或?qū)崿F(xiàn)該接口的接口
泛型類本質(zhì)上仍然是一個類,依然可以繼承:
internal class GenericeComparer<T> : Comparer<T> where T : IComparable<T> class MyArray<T> : ArrayList
典型的泛型類
在System.Collections.Generic命名空間和System.Collections.ObjectModel中,定義了不同的泛型類和泛型接口,這些泛型多為集合類。
- List<T> 對應ArrayList集合類
- SortedList<TKey, TValue> 對應SortedList集合類
- Queue<T> 先進先出的集合類
- Stack<T> 后進先出的集合類
- Collection<T> 自定義泛型集合的基類
- Dictionary<TKey, TValue> 對應于Hashtable集合類
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關內(nèi)容請查看下面相關鏈接
相關文章
asp.net AjaxControlToolKit--TabContainer控件的介紹
ModalPopup控件允許一個asp頁面的部分內(nèi)容以對話框的模式顯示給用戶,同時會限制用戶于頁面的其他部分交互。對話框顯示的內(nèi)容可以是一個層級,這個層級的背景可以使用戶自定義的格式,簡單的理解好比是一個對話框彈出來后,主頁面會顯示灰色,且不可操作。2009-06-06
.Net中的弱引用字典WeakDictionary和ConditionalWeakTable介紹
這篇文章介紹了.Net中的弱引用字典WeakDictionary和ConditionalWeakTable,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06
Asp.net中static變量和viewstate的使用方法(謹慎)
如在頁面中統(tǒng)計某個按鈕被按下的次數(shù),先在類中OnClick事件的處理過程前定義一static變量times,則每次調(diào)用該按鈕的OnClick事件時,令times增1即可,非常方便,接下來詳細介紹,感興趣的朋友可以了解下2013-01-01
asp.net CommunityServer中的wwwStatus
最近不得不對這個論壇進行研究,以適應后面的發(fā)展,現(xiàn)在同事研究太吃力了,以后改些東西,估計又要...打開web項目中的communityserver.config發(fā)現(xiàn)一個有趣的地方。2009-03-03
建立自定義的數(shù)據(jù)驅(qū)動的本地化資源provider
本文探討了自定義的本地化資源提供者.如果想用一個可替代系統(tǒng)的資源處理方案,例如把所有的資源放入數(shù)據(jù)庫中,而不是放在分散的資源文件里,你可以自定義一個resource provider.2010-06-06
ASP.NET設計網(wǎng)絡硬盤之查看文件夾實現(xiàn)代碼
下面要介紹的實例包括網(wǎng)上硬盤的許多功能,將一步步為大家進行介紹。首先創(chuàng)建工程實例,然后進行主界面的設計,最后對各個功能的實現(xiàn)分別進行介紹2012-10-10

