跳到主要內容

C# 泛型

為什麼要使用泛型Generic

這次要提到的是泛型,也是這次我負責上課的部分。
我會就自己的吸收用自己的理解來說明什麼是泛型。
泛型簡單的說就是 C# 2.0 提出的一種新的集合類別,用於汰換掉 .NET 1.1 的非泛型集合類別。

以 List<T> 為例子,就是拿來汰換掉 ArrayList 用的。
以前 ArrayList 提出也是為了解決某些問題而發明出來的類別,主要是解決程式碼重複的問題。 為了儲存 int 需要設計一個儲存 int 的集合類別,為了儲存 string 需要一個儲存 string 的集合類別。 所以不如設計一個 ArrayList 可以儲存 int 也可以儲存 string 。這是怎麼做到的呢?
原理就是因為型別都是來至於 object ,因此只要將所有型別的先轉換成 object 存起來,然後要用的時候再取出來,然後從 object 轉型回原本儲存的型別就好,這就是 ArrayList 。

講完 ArrayList,來說說 List<T> ,泛型是在實例化的時候確定使用的型別,以便於在編譯時期就可以判斷型別安全性,也因此帶出泛型與 ArrayList 比較後的優點。可以讓編譯器來保護程式碼。至於程式碼重複這個優點泛型跟 ArrayList 一樣都有,另外還有一個 優點,那就是效能。 ArrayList 出了什麼問題呢? 最主要的問題就是轉型,因為儲存成 object ,存入時跟取出時都需要做轉型,這稱為 Boxing / UnBoxing,從 int 轉型成 object 稱為 Boxing;反之從 object 轉成 int 就是 UnBoxing了,這耗費效能。但 List<T> 因為在實例化的時候就指定好型別的,因此沒有這個問題。

以上三個好處,程式碼重複使用、型別安全性、效能,就是以泛型集合類別取代非泛型集合類別的好處。

留言

這個網誌中的熱門文章

加密貨幣交易實戰心得筆記

加密貨幣交易實戰心得筆記 . 對於加密貨幣,雖然公司有個團隊已經在開發相關產品,但我自己只有大概了解什麼是加密貨幣,什麼是比特幣,以及什麼是區塊鍊。雖然稍微知道,但也只是知道,並沒有真的去購買跟投資。 . 幾天前公司舉辦了一場課程,邀請了史旺基到公司分享加密貨幣的交易實戰。課程需要自費,但其中包含了直接幫我們購買比特幣,並將購買的比特幣交易給我們。可以實際接觸到加密貨幣的交易讓我很期待,因此毫不猶豫的就參加了這堂課程。 . 這堂課程並不是在技術上來跟你說什麼是加密貨幣或是區塊鍊的技術是什麼,它著重在由淺入深的介紹什麼是比特幣、什麼是區塊鍊、什麼是去中心化、什麼是挖礦、誰是中本聰、什麼是以太坊以及以太幣、什麼是熱錢包以及冷錢包,等等這類的相關資訊。 . 學習並了解上面介紹的基本資訊之後,課程的重點放在了交易所的介紹與操作上面。我們一步一步的申請了台灣的兩個交易所,分別是 MaiCoin 以及 BitoEX。相信有在投資比特幣的人應該都已經知道,但對於沒有追上潮流的我來說,這個資訊真的是省了我很多研究的時間,立刻感覺前進了一大步,雖然手續費高常常可能卡幣,但中文介面,簡單的認證與交易方式,讓我感覺已經真的觸碰到了比特幣與區塊鍊的邊。 . 除了台灣交易所,更有國際交易平台的介紹與教學,這邊我就不一一介紹了,因為我自己也都還沒申請,而且這些國際平台很多是停止申請帳號的。 . 另外還有更多的資訊,包括怎麼開始投資,投資心法以及不少的中英文介紹資料,包括App的介紹。 . 這堂課除了讓我立刻從門外漢大躍進成初心者,更是直接開始打怪(購買)了,破除了這個最大靜摩擦力之後,我讓我的投資標的又多了一個可能,感覺非常值得。

Multiple without multication or addition operator

Given two binary strings, return their sum (also a binary string). For example, a = "1101" // 13 b = "1000" // 8 Return “1101000”. // 104 Solution: implement Binary add to perform multication static int MultipleWithoutOperator(int num, int multiplier) { StringBuilder sb = new StringBuilder(); string binary = Convert.ToString(num, 2); string binaryMultiplier = Convert.ToString(multiplier, 2); string temp = ""; for (int i = binaryMultiplier.Length-1, j=0;i >= 0;i--,j++){ if (binaryMultiplier[i]=='1') { if (string.IsNullOrEmpty(temp)) { temp = binary.PadRight(binary.Length + j, '0'); } else { temp = BinaryAdd(temp, binary.PadRight(binary.Length + j, '0')); } } } return Convert.ToInt32(temp, 2); } static string BinaryAdd(string a, string b) { int carryover = 0; Stri...

[Resharper] fix "if" template

Resharper 2018.2.3 hsa a bug for "if" template will not found the basic expression such as field and local variable. how to fix it? ctrl + Q -> find "template explorer" -> find "c#" -> find "if" and change the "expr" change the expr form smart completion to basic completion