溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#中怎么實現泛型處理

發布時間:2021-07-07 17:04:26 來源:億速云 閱讀:196 作者:Leah 欄目:編程語言

C#中怎么實現泛型處理,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

C#泛型處理的問題陳述

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

public class Stack  {     object[] m_Items;      public void Push(object item)     {...}     public object Pop()     {...}  }

C#泛型處理代碼塊

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

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

基于 Object 的堆棧

public class Stack  {     readonly int m_Size;      int m_StackPointer = 0;     object[] m_Items;      public Stack():this(100)     {}        public Stack(int size)     {        m_Size = size;        m_Items = new object[m_Size];     }     public void Push(object item)     {        if(m_StackPointer >= m_Size)            throw new StackOverflowException();               m_Items[m_StackPointer] = item;        m_StackPointer++;     }     public object Pop()     {        m_StackPointer--;        if(m_StackPointer >= 0)        {           return m_Items[m_StackPointer];        }        else       {           m_StackPointer = 0;           throw new InvalidOperationException(          "Cannot pop an empty stack");        }     }  }

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

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

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

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

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

public class IntStack  {     int[] m_Items;      public void Push(int item){...}     public int Pop(){...}  }   IntStack stack = new IntStack();  stack.Push(1);  int number = stack.Pop();

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

public class StringStack  {     string[] m_Items;      public void Push(string item){...}     public string Pop(){...}  }  StringStack stack = new StringStack();  stack.Push("1");  string number = stack.Pop();

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

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

看完上述內容,你們掌握C#中怎么實現泛型處理的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女