[轉]c# 泛類型(泛型) 以及強型別與弱類型的 理解及最佳化

來源:互聯網
上載者:User

標籤:

[泛型的概念]
(1)沒有泛型的時候,所有的對象都是以object為基礎,如果要使用時必須進行強制類型轉換,如果對於實值型別,則會導致不斷拆箱裝箱的過程,對系統消耗很大。
(2)使用泛型時不需要通過object類進行裝箱拆箱,使用的時候都會是確定的類型。
(3)泛型的概念一開始是由集合引入,因為集合中的類型都是基於object類。可以在集合中使用泛型類。
(4)泛型不僅僅用於集合,還可以用於委託、介面和方法。
泛型的優點:高效能
ArrayList list1 = new ArrayList();
list1.Add(44); //裝箱
int il1 = (int)list1[0];//拆箱
foreach (int i2 in list1)
Console.WriteLine(i2); //執行拆箱

頻繁的拆箱、裝箱操作在沒有泛型的時候反覆進行,對系統資源消耗很大。可以使用泛型集合。

List<int> list2 = new List<int>();
list2.Add(44); //不執行裝箱
int il2 = list2[0];//不執行拆箱
foreach (int i2 in list2)
Console.WriteLine(i2); //不執行拆箱

泛型在定義的時候就區分了實值型別和參考型別。

泛型的優點:型別安全
 ArrayList list = new ArrayList();
  list.Add(44);
  list.Add("mystring");
  list.Add(new MyClass());
  foreach (int i in list)
  Console.WriteLine(i);  

型別安全在於提前避免異常的出現。

List<int> list2 = new List<int>();
list2.Add(44);
 //list2.Add("mystring");
 //list2.Add(new MyClass());
直接編譯不通過。


泛型的優點:代碼的重用與擴充
List<T>這個泛型類在使用時可以根據需要用不同的類型執行個體化:

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());

泛型的優點:代碼的重用與擴充

定義一個泛型類:
public class aaa<T> 注意:這裡的T只是一個標識而已,定義成任何字元都可以。
  {
  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)如果泛型型別有特定的要求(例如必須實現一個派生於基類的介面),或者使用了兩個或多個泛型型別,就應給泛型型別使用描述性的名稱:
比如:
 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。

 

 

  強型別和弱類型指的是兩個具有直接或者間接繼承關係的兩個類。如果一個類是另一個類的直接或者間接基類,那麼它為弱類型,直接或者間接子類為強型別。後續的介紹中會用到的兩個類Foo和Bar先定義在這裡。Bar繼承自Foo。Foo是弱類型,而Bar則是強型別。

  有了強型別和弱類型的概念,我們就可以這樣的定義協變和逆變:如果類型TBar是基於強型別Bar的類型,而類型TFoo是基於弱類型Foo的類型,協變就是將TBar類型的執行個體賦值給TFoo類型的變數,而逆變則是將TFoo類型的執行個體賦值給TBar類型的變數。

  委託中的協變與逆變的使用

  協變和逆變主要體現在兩個地方:介面和委託,先來看看在委託中如何使用協變和逆變。現在我們定義了如下一個表示無參函數的泛型委派 Function,型別參數為函數傳回值的類型。泛型參數之前添加了一個out關鍵字表示T是一個協變變體。那麼在使用過程中,基於強型別的委託 Fucntion執行個體就可以賦值給基於弱類型的委託Fucntion變數。

 

[強型別弱類型]

一直說C#是強型別語言,通俗地講,便是指C#中的“變數”在開發時的類型便是明確的:String便是String,Int32就是Int32,毫無爭議。強型別的好處有很多,張嘴便可隨意舉上幾例:

能夠享受代碼提示功能 
能夠獲得重構工具的支援 
能夠在編譯期發現更多錯誤 
 不過C#也不是“絕對”的強型別語言,因為它也有弱類型,那就是Object。我們知道Object是所有類型的最終基類,任何類型的對象都可以使用 Object來引用。可是一旦轉化成Object的變數之後,代碼提示便消失了;即使我們“明確”對象的確切類型,也必須通過Cast才能使用——更何況它形成了一種被“濫用”或“誤用”的機會。例如一段錯誤碼可能會傳入一個不符合約定類型的對象,那麼就會造成錯誤。更嚴重的是,這樣的錯誤可能只要在 “運行時”才能被發現,編譯器對此無能為力。

摘自:http://hi.baidu.com/morespring/blog/item/fe9220358a03690aebc4afa4.html

[轉]c# 泛類型(泛型) 以及強型別與弱類型的 理解及最佳化

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.