[转]c# 泛类型(泛型) 以及强类型与弱类型的 理解及优化
[泛型的概念]
(1)沒有泛型的時候,所有的對象都是以object為基礎(chǔ),如果要使用時必須進(jìn)行強(qiáng)制類型轉(zhuǎn)換,如果對于值類型,則會導(dǎo)致不斷拆箱裝箱的過程,對系統(tǒng)消耗很大。
(2)使用泛型時不需要通過object類進(jìn)行裝箱拆箱,使用的時候都會是確定的類型。
(3)泛型的概念一開始是由集合引入,因為集合中的類型都是基于object類。可以在集合中使用泛型類。
(4)泛型不僅僅用于集合,還可以用于委托、接口和方法。
泛型的優(yōu)點(diǎn):高性能
ArrayList list1 = new ArrayList();
list1.Add(44); //裝箱
int il1 = (int)list1[0];//拆箱
foreach (int i2 in list1)
Console.WriteLine(i2); //執(zhí)行拆箱
頻繁的拆箱、裝箱操作在沒有泛型的時候反復(fù)進(jìn)行,對系統(tǒng)資源消耗很大。可以使用泛型集合。
List<int> list2 = new List<int>();
list2.Add(44); //不執(zhí)行裝箱
int il2 = list2[0];//不執(zhí)行拆箱
foreach (int i2 in list2)
Console.WriteLine(i2); //不執(zhí)行拆箱
泛型在定義的時候就區(qū)分了值類型和引用類型。
泛型的優(yōu)點(diǎn):類型安全
?ArrayList list = new ArrayList();
? list.Add(44);
? list.Add("mystring");
? list.Add(new MyClass());
? foreach (int i in list)
? Console.WriteLine(i); ?
類型安全在于提前避免異常的出現(xiàn)。
List<int> list2 = new List<int>();
list2.Add(44);
?//list2.Add("mystring");
?//list2.Add(new MyClass());
直接編譯不通過。
泛型的優(yōu)點(diǎn):代碼的重用與擴(kuò)展
List<T>這個泛型類在使用時可以根據(jù)需要用不同的類型實例化:
List<int> list=new List<int>();
list.Add(44);
List<string> stringList=new List<string>();
stringList.Add(“mystring”);
List<MyClass> myclassList=new List<MyClass>();
myClassList.Add(new MyClass());
泛型的優(yōu)點(diǎn):代碼的重用與擴(kuò)展
定義一個泛型類:
public class aaa<T> 注意:這里的T只是一個標(biāo)識而已,定義成任何字符都可以。
? {
? public void abc(T a)
? {
? Console.WriteLine(a);
? }
? }
使用它:
? //使用string實例化
? aaa<string> aaa = new aaa<string>();
? aaa.abc("aaabbb");
? //使用int實例化
? aaa<object> bbb = new aaa<object>();
? bbb.abc(new object());
? Console.Read();
命名約定
(1)泛型類型的名稱用字母T作為前綴。
(2)使用泛型時,使用<T>,如:
Public class List<T> {}
Public class Linkedlist<T>{}
(3)如果泛型類型有特定的要求(例如必須實現(xiàn)一個派生于基類的接口),或者使用了兩個或多個泛型類型,就應(yīng)給泛型類型使用描述性的名稱:
比如:
?public interface ccc<TTT>
? { void abc(TTT arg1); }
?public class aaa<TTT>:ccc<TTT>
? { public void abc(TTT a)
? { Console.WriteLine(a); } }
Public class SortedList<TKey,Tvalue>{}
泛型集合
泛型集合存在于using System.Collections.Generic下.我們主要介紹如下List<T> ,其它的泛型集合使用請查閱MSDN。
?
?
強(qiáng)類型和弱類型指的是兩個具有直接或者間接繼承關(guān)系的兩個類。如果一個類是另一個類的直接或者間接基類,那么它為弱類型,直接或者間接子類為強(qiáng)類型。后續(xù)的介紹中會用到的兩個類Foo和Bar先定義在這里。Bar繼承自Foo。Foo是弱類型,而Bar則是強(qiáng)類型。
有了強(qiáng)類型和弱類型的概念,我們就可以這樣的定義協(xié)變和逆變:如果類型TBar是基于強(qiáng)類型Bar的類型,而類型TFoo是基于弱類型Foo的類型,協(xié)變就是將TBar類型的實例賦值給TFoo類型的變量,而逆變則是將TFoo類型的實例賦值給TBar類型的變量。
委托中的協(xié)變與逆變的使用
協(xié)變和逆變主要體現(xiàn)在兩個地方:接口和委托,先來看看在委托中如何使用協(xié)變和逆變。現(xiàn)在我們定義了如下一個表示無參函數(shù)的泛型委托 Function,類型參數(shù)為函數(shù)返回值的類型。泛型參數(shù)之前添加了一個out關(guān)鍵字表示T是一個協(xié)變變體。那么在使用過程中,基于強(qiáng)類型的委托 Fucntion實例就可以賦值給基于弱類型的委托Fucntion變量。
?
[強(qiáng)類型弱類型]
一直說C#是強(qiáng)類型語言,通俗地講,便是指C#中的“變量”在開發(fā)時的類型便是明確的:String便是String,Int32就是Int32,毫無爭議。強(qiáng)類型的好處有很多,張嘴便可隨意舉上幾例:
能夠享受代碼提示功能?
能夠獲得重構(gòu)工具的支持?
能夠在編譯期發(fā)現(xiàn)更多錯誤?
不過C#也不是“絕對”的強(qiáng)類型語言,因為它也有弱類型,那就是Object。我們知道Object是所有類型的最終基類,任何類型的對象都可以使用 Object來引用。可是一旦轉(zhuǎn)化成Object的變量之后,代碼提示便消失了;即使我們“明確”對象的確切類型,也必須通過Cast才能使用——更何況它形成了一種被“濫用”或“誤用”的機(jī)會。例如一段錯誤代碼可能會傳入一個不符合約定類型的對象,那么就會造成錯誤。更嚴(yán)重的是,這樣的錯誤可能只要在 “運(yùn)行時”才能被發(fā)現(xiàn),編譯器對此無能為力。
摘自:http://hi.baidu.com/morespring/blog/item/fe9220358a03690aebc4afa4.html
轉(zhuǎn)載于:https://www.cnblogs.com/bluewhale84/p/4401705.html
總結(jié)
以上是生活随笔為你收集整理的[转]c# 泛类型(泛型) 以及强类型与弱类型的 理解及优化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 难料是什么歌呢
- 下一篇: 通过反射执行get、set方法