成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺析C#泛型處理的問題空間

開發 后端
C#泛型是什么內容?C#泛型處理什么樣的問題?那么在本文中就向你介紹C#泛型處理的問題空間等相關內容。

C#泛型是C# 2.0 的***大的功能。C#泛型處理什么樣子的問題呢?我們通過C# 泛型處理可以定義類型安全的數據結構,而無須使用實際的數據類型。這樣能夠顯著提高性能并得到更高質量的代碼,因為您可以重用數據算法,而無須復制類型特定的代碼。在概念上,C# 泛型類似于 C++ 的模板,但是在實現和功能方面存在明顯不同。本系列文章將討論C#泛型處理的問題空間、它們的實現方式、該編程模型的好處,以及獨特的創新(例如,約束、一般方法和委托以及一般繼承)。您還將了解在 .NET Framework 的其他領域(例如,反射、數組、集合、序列化和遠程處理)中如何利用泛型,以及如何在所提供的基本功能的基礎上進行改進。

C#泛型處理的問題陳述

考慮一種普通的、提供傳統 Push() 和 Pop() 方法的數據結構(例如,堆棧)。在開發通用堆棧時,您可能愿意使用它來存儲各種類型的實例。在 C# 1.1 下,您必須使用基于 Object 的堆棧,這意味著,在該堆棧中使用的內部數據類型是難以歸類的 Object,并且堆棧方法與 Object 交互:

  1. public class Stack  
  2. {  
  3.    object[] m_Items;   
  4.    public void Push(object item)  
  5.    {...}  
  6.    public object Pop()  
  7.    {...}  

C#泛型處理代碼塊

顯示基于 Object 的堆棧的完整實現。因為 Object 是規范的 .NET 基類型,所以您可以使用基于 Object 的堆棧來保持任何類型的項(例如,整數):

  1. Stack stack = new Stack();  
  2. stack.Push(1);  
  3. stack.Push(2);  
  4. int number = (int)stack.Pop(); 

基于 Object 的堆棧

  1. public class Stack  
  2. {  
  3.    readonly int m_Size;   
  4.    int m_StackPointer = 0;  
  5.    object[] m_Items;   
  6.    public Stack():this(100)  
  7.    {}     
  8.    public Stack(int size)  
  9.    {  
  10.       m_Size = size;  
  11.       m_Items = new object[m_Size];  
  12.    }  
  13.    public void Push(object item)  
  14.    {  
  15.       if(m_StackPointer >= m_Size)   
  16.          throw new StackOverflowException();         
  17.       m_Items[m_StackPointer] = item;  
  18.       m_StackPointer++;  
  19.    }  
  20.    public object Pop()  
  21.    {  
  22.       m_StackPointer--;  
  23.       if(m_StackPointer >= 0)  
  24.       {  
  25.          return m_Items[m_StackPointer];  
  26.       }  
  27.       else 
  28.       {  
  29.          m_StackPointer = 0;  
  30.          throw new InvalidOperationException(  
  31.         "Cannot pop an empty stack");  
  32.       }  
  33.    }  

但是,基于 Object 的解決方案存在兩個問題。***個問題是性能。在使用值類型時,必須將它們裝箱以便推送和存儲它們,并且在將值類型彈出堆棧時將其取消裝箱。裝箱和取消裝箱都會根據它們自己的權限造成重大的性能損失,但是它還會增加托管堆上的壓力,導致更多的垃圾收集工作,而這對于性能而言也不太好。即使是在使用引用類型而不是值類型時,仍然存在性能損失,這是因為必須從 Object 向您要與之交互的實際類型進行強制類型轉換,從而造成強制類型轉換開銷:

  1. Stack stack = new Stack();  
  2. stack.Push("1");  
  3. string number = (string)stack.Pop(); 

基于 Object 的解決方案的第二個問題(通常更為嚴重)是類型安全。因為編譯器允許在任何類型和 Object 之間進行強制類型轉換,所以您將丟失編譯時類型安全。例如,以下代碼可以正確編譯,但是在運行時將引發無效強制類型轉換異常:

  1. Stack stack = new Stack();  
  2. stack.Push(1);  
  3. //This compiles, but is not type safe, and will throw an exception:   
  4. string number = (string)stack.Pop(); 

您可以通過提供類型特定的(因而是類型安全的)高性能堆棧來克服上述兩個問題。對于整型,可以實現并使用 IntStack:

  1. public class IntStack  
  2. {  
  3.    int[] m_Items;   
  4.    public void Push(int item){...}  
  5.    public int Pop(){...}  
  6. }   
  7. IntStack stack = new IntStack();  
  8. stack.Push(1);  
  9. int number = stack.Pop(); 

對于字符串,可以實現 StringStack:

  1. public class StringStack  
  2. {  
  3.    string[] m_Items;   
  4.    public void Push(string item){...}  
  5.    public string Pop(){...}  
  6. }  
  7. StringStack stack = new StringStack();  
  8. stack.Push("1");  
  9. string number = stack.Pop(); 

C#泛型處理問題的出現必然性:

遺憾的是,以這種方式解決性能和類型安全問題,會引起第三個同樣嚴重的問題 — 影響工作效率。編寫類型特定的數據結構是一項乏味的、重復性的且易于出錯的任務。在修復該數據結構中的缺陷時,您不能只在一個位置修復該缺陷,而必須在實質上是同一數據結構的類型特定的副本所出現的每個位置進行修復。此外,沒有辦法預知未知的或尚未定義的將來類型的使用情況,因此還必須保持基于 Object 的數據結構。結果,大多數 C# 1.1 開發人員發現類型特定的數據結構不實用,并且選擇使用基于 Object 的數據結構,盡管它們存在缺點。

C#泛型處理的問題空間等等內容的介紹就講述到這里,希望對你了解和學習C#泛型處理問題方面有所幫助。

【編輯推薦】

  1. C#網絡編程基本概念TCP淺析
  2. C#網絡聊天程序三大模式淺析
  3. C#服務端端口偵聽淺析
  4. ASP.NET異步回調淺析
  5. C#網絡編程入門基礎知識淺析
責任編輯:仲衡 來源: MSDN
相關推薦

2009-08-24 15:12:13

C# 泛型接口

2009-08-24 18:15:24

C# Dictiona

2009-08-24 14:51:25

C# 泛型泛型類型

2009-08-24 17:58:19

C# 泛型集合

2009-08-24 17:27:05

C#泛型應用

2009-08-24 16:39:19

C# 泛型應用

2009-08-24 11:35:20

C# 泛型應用

2009-08-24 15:50:23

C# 泛型C# 泛型委托

2009-08-24 14:20:13

C# 強制類型轉換

2009-08-24 16:01:44

C# 泛型

2009-08-24 13:31:38

C# 泛型約束

2009-08-24 10:37:27

C# 泛型

2009-08-24 15:28:19

C# 泛型方法

2009-08-24 17:39:21

C# 泛型集合

2009-08-24 13:41:23

C# 泛型約束

2009-08-24 16:19:42

C# 泛型方法

2009-08-26 18:02:05

C#泛型問題

2009-08-24 12:58:15

C# 泛型約束

2009-08-24 14:26:42

C# 泛型類

2009-08-28 13:56:25

C#反射命名空間
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩欧美在线不卡 | 免费成人高清在线视频 | 亚洲欧美在线一区 | 欧美久久一级 | 成人动漫一区二区 | 综合第一页| 99久久婷婷国产综合精品首页 | 九九99靖品| 国产精品九九九 | 久久精品免费一区二区 | 久久亚洲一区 | 亚洲精品欧美 | 天天干,夜夜操 | 中文字幕丁香5月 | 成人欧美日韩一区二区三区 | 岛国午夜| 成人毛片在线观看 | 免费看一区二区三区 | 99精品视频网 | 久久久久久久久国产精品 | 日韩视频专区 | 国产精品高潮呻吟久久av野狼 | av手机在线免费观看 | 精品国产18久久久久久二百 | 日本欧美大片 | 中文二区 | 三级黄视频在线观看 | 在线观看亚洲一区二区 | 金莲网| 欧美一区二区三区电影 | 欧美视频二区 | 亚洲高清一区二区三区 | 午夜久久久久久久久久一区二区 | 日韩av一区在线观看 | 91国产视频在线 | 日本三级全黄三级三级三级口周 | 超碰在线免费公开 | 精品久久1| 欧美在线观看一区 | 卡通动漫第一页 | 在线成人一区 |