C#基于Object解決方案
C#語言有很多值得學習的地方,這里我們主要介紹C#基于Object解決方案,包括介紹編譯器允許在任何類型和Object之間進行強制類型轉換等方面。
C#基于Object解決方案存在兩個問題。第一個問題是性能。在使用值類型時,必須將它們裝箱以便推送和存儲它們,并且在將值類型彈出堆棧時將其取消裝箱。裝箱和取消裝箱都會根據它們自己的權限造成重大的性能損失,但是它還會增加托管堆上的壓力,導致更多的垃圾收集工作,而這對于性能而言也不太好。即使是在使用引用類型而不是值類型時,仍然存在性能損失,這是因為必須從 Object 向您要與之交互的實際類型進行強制類型轉換,從而造成強制類型轉換開銷:
- Stack stack = new Stack();
- stack.Push("1");
- string number = (string)stack.Pop();
C#基于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();
【編輯推薦】