C#基礎知識-數組_ArrayList_List(九)

来源:http://www.cnblogs.com/leonliuyifan/archive/2017/06/18/7044408.html
-Advertisement-
Play Games

之前兩篇文檔講述了C#中的面向對象的概念,其實這個概念對於很多種語言都是通用的,只不過每種語言具體實現的過程方法不一樣,比如Java、C++、python等,這些都是很流行的面向對象的語言在編程語言排行榜中都是屬於前幾名的。面向對象中比較難以理解的就是多態的概念,多態我將留到後面的章節去講,現在繼續 ...


之前兩篇文檔講述了C#中的面向對象的概念,其實這個概念對於很多種語言都是通用的,只不過每種語言具體實現的過程方法不一樣,比如Java、C++、python等,這些都是很流行的面向對象的語言在編程語言排行榜中都是屬於前幾名的。面向對象中比較難以理解的就是多態的概念,多態我將留到後面的章節去講,現在繼續先學習好基本的一些語法理解好語意才能更好的理解。

 

數組
數組顧名思義就是一組同類數據元素的集合,數組不單單是數字的集合,可以是多種類型的,但是集合中元素必須是同一種數據類型,那麼什麼是同類數據的元素呢?在第一篇中有介紹C#中15中最常用的數據類型(類型還可以自己擴展),每種類型有最大值最小值,每一個值就相當於是一個元素了,打個比如int類型的數組那就只可以存儲int的類型的元素,如果在int類型中存儲string類型,那麼編譯器或報錯,數組在C#中是最早出現的,在記憶體中是連續存儲的,所以它的索引速度非常快,下麵來看一下如果聲明一個數組。

 

這裡使用int類型:

 1   //創建一個大小為3的數組
 2 
 3     int[] intArray = new int[3];
 4 
 5     //賦值
 6 
 7     intArray[0] = 1;
 8 
 9     intArray[1] = 2;
10 
11     intArray[2] = 3;
12 
13     //修改
14 
15   intArray[2]=4;

 

但是在數組中存在一些不足的地方,比如在數組的兩個數據之間插入數據是很麻煩,在插入數組後面的所有元素都要往後退一位,而且在聲明數組的時候必須指定數組的長度,數組的長度過長,會造成記憶體的浪費,過長也會造成數據溢出的錯誤,針對數組的這些缺點,又推出了ArrayList對象來剋服這些缺點。

 

ArrayList

在命名空間System.Collection中,ArrayLis存儲的對象元素是動態去分配的,根據需求去進行相應的擴容和收縮空間,所以在聲明ArrayLis對象時並不需要去指定它的長度。

 1 //聲明一個ArrayList對象
 2 ArrayList arrayList = new ArrayList();
 3 
 4 //新增數據
 5 arrayList.Add(123);
 6 arrayList.Add("Leon");
 7 
 8 //修改數據
 9 arrayList[1] = 32;
10 
11 //刪除
12 arrayList.Remove(0);
13 
14 //插入數據
15 arrayList.Insert(0, 445);

 

從上面的例子中ArrayList好像是解決上面數組遺留下來的問題,當時當你實際編譯的時候就會遇到異常了,如果有在編譯器上實習輸入代碼編譯的同學會發現,arrayList.Add( )這個方法接受的是一個object的類型,那麼當我在arrayList[0],這個位置賦值的時候就會出現一個裝箱拆箱所帶來的性能損耗,而且在我第二次使用Add時插入的是一個string類型的變數,那麼同一個數組中出現兩種不一樣的數據類型,並且在編譯的時候是正常的,所以在編譯時不能檢查類型,在運行中就會出現錯誤。裝箱拆箱實際上就是object類型和其它類型之間的數據轉換所帶來的性能損耗,具體過程可以在網上查下資料。

 

泛型List

因為ArrayList存在不安全類型與裝箱拆箱的缺點,所以後面微軟又推出了泛型,List類和ArrayList類的用法相似,但是最關鍵的地方在於 List聲明集合的時候必須要指定數據對象的類型。

 1 //聲明List集合對象
 2 List<string> listString = new List<string>();
 3 
 4 //增加
 5 listString.Add("leon");
 6 
 7 //修改
 8 listString[0] = "newLeon";
 9 
10 //刪除數據
11 listString.RemoveAt(0);

 

這裡可以看到,List和ArrayList的用法差不多,區別就在於List在聲明的時候必須要指定數據對象的類型,這樣如果嘗試在listString中插入int類型的值編譯器就會報錯,在編譯時就可以避免一個類型安全的問題,和裝箱拆箱帶來的性能損耗。

 

小結:

       數組的存儲容量是固定的,每次只能對一個值去進行操作,而且在兩個值之間插入一個元素的話很麻煩,不方便操作。

       ArrayList中雖然定義好的一套方法可以很方便的去操作數組,很好的刪除、插入元素,但是由於裝箱拆箱的過程會浪費很多資源,而且編譯時沒有提供一個安全類型的檢查,使得在一個有int類型的數組中允許插入其它類型的,比如string,這樣雖然在編譯時不會報錯,但是在運行時會發生異常。

       泛型List,泛型int類型是強類型,在編譯時會檢查類型,並且減少裝箱拆箱帶來的損耗。

這裡註意數組可以是多維度的但是,ArrayList和List始終只具有一個維度。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • yum groups install -y "GNOME Desktop" "Graphical Administration Tools" ...
  • 在實際的系統開發中,我們往往需要一些簡單的的案例代碼,基於此目的我把Winform開發框架中各種閃光點和不錯的功能,有些是我們對功能模塊的簡單封裝,而有些則是引入了一些應用廣泛的開源組件進行集成使用,因此把它們做了一個Demo進行展示,以方便我們隨時瞭解和參考,並能夠快速應用相應的場景到具體的項目中... ...
  • 軟體環境: Win7 x64 SP1 SQL Server 2008r2 Visual Studio 2017 Professional 目標:取出示例資料庫 ReportServer 的表 Roles 中的所有記錄並顯示。 步驟: 一、添加軟體包 使用NuGet添加以下軟體包: ServiceSt ...
  • 一、泛型 假設我要寫個公用的輸出傳入參數的方法(不用泛型),因為萬物皆對象的理由,我先定義一個方法show(object obj),如下麵所示: 執行這個方法 如果傳入的是值類型,值類型轉換為引用類型,我們知道會發生裝箱,這是對性能的損害,想想如果是個集合,就得多次執行裝箱、拆箱操作。如ArrayL ...
  • .net core 填坑記之二目錄問題(獲取當前目錄、創建目錄) ...
  • SqlSugar 4.0 ORM框架的優勢 為了未來能夠更好的支持多庫分散式的存儲,並行計算等功能,將SqlSugar3.x全部重寫,現有的架構可以輕鬆擴展多庫。 源碼下載: https://github.com/sunkaixuan/SqlSugar 1.性能 性能最好的ORM之一,具有超越Dap ...
  • 上一篇中講到XML基本的結構,還有增刪改查的方法,這一篇中我們就來利用XML來完成一個簡單的訂單系統,主要是實現一個簡單學生名單的增刪改查,如果想要應用到實際的環境中建議考慮數據量的問題,如果數據量大使用XML的話會比較耗時,使用SQL的性能會好一些 這裡使用WinForm窗體程式,大致界面如下: ...
  • 在講了一系列的基礎文檔之後,現在開始講一些實例。對於一些數據不是很大的程式,或者只是一些配置文件,需要本地存儲的,完全可以使用XML代替資料庫,因為只是去操作單個文件會比操作資料庫要簡單很多,在程式中訪問和操作XML一般使用DOM(文檔對象模型)和流模式。DOM運行編輯和更新XML文檔,可以隨機訪問 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...