【C#進階系列】15 數組

来源:http://www.cnblogs.com/vvjiang/archive/2016/03/24/5317788.html
-Advertisement-
Play Games

首先提一下,個人在項目中已經很少用到數組了,更多的時候使用List<>。 數組大小固定,如果只是用來存放數據,專門用來讀取,更改當然方便。但是更多的時候我們需要進行增刪改,這個時候用List<>反而更好。 所有數組類型都從System.Array抽象類隱式派生,後者又派生自System.Object ...


首先提一下,個人在項目中已經很少用到數組了,更多的時候使用List<>。

數組大小固定,如果只是用來存放數據,專門用來讀取,更改當然方便。但是更多的時候我們需要進行增刪改,這個時候用List<>反而更好。

所有數組類型都從System.Array抽象類隱式派生,後者又派生自System.Object。

一個數組的誕生

String[] arr=String[10];

當執行上述語句時,CLR會自動為AppDomain創建一個String[]類型。該類型隱式派生自System.Array,所以它可以用System.Array中定義的方法。

而所有的數組都隱式實現IEnumerable,ICollection和IList,因為System.Array也實現這三個介面。

並且當創建的是一維0基數組類型,CLR會自動使數組類型實現當前IEnumerable,ICollection和IList這三個介面的基於基礎類型及其基類(這裡的基礎類型就是指String和它的基類Object)的泛型玩法,

即IEnumerable<String>,ICollection<String>和IList<String>,IEnumerable<Object>,ICollection<Object>和IList<Object>.(而System.Array是不實現的,因為涉及到多維數組和非0基數組)。這裡說的0基數組是指數組索引以0開始開始的數組。

然而如果數組的基礎類型是值類型,即int[]這種,是不會實現泛型介面的,只會實現那三個非泛型介面。

數組始終是引用類型,所以會在堆上分配,而不是像c一樣在棧上分配。

創建引用類型數組,實際上創建的只是一個裝滿了引用的數組,而具體引用類型並沒有被創建,這些引用預設為null。 

三種數組

通常來講我們會用到以下三種數組:

int[] 一維數組 = new int[5];
int[,] 多維數組 = new int[3, 4];
int[][] 交錯數組 = new int[2][];
交錯數組[0] = new int[10];
交錯數組[1] = new int[100];

數組的類型轉換

數組的也可以轉換基礎類型,比如將String[]類型就可以轉換為Object[]類型。

但是轉型要求數組維數相同,且CLR不允許將值類型的數組轉化為任何類型。(但是可以用Array.Copy來實現值類型數組的轉換)

如果只是需要將一個數組中的某些元素複製到另一個同類型數組中,那麼可以考慮System.Buffer的BlockCopy方法,一看這些奇怪的名字就知道是底層操作,它比Array.Copy快。但是它不能像Array.Copy那樣提供轉型能力,比如將Object[]轉成Int[].

數組的傳遞和返回

數組作為參數來傳遞,實際上傳遞的只是數組的引用。

如果定義了返回數組引用的方法,而且數組中不包含元素,那麼就可以返回null,但是推薦返回new int[0]這樣的東西。

創建非0基數組

老實說本來不打算寫的,確實搞不清楚哪裡要用到這種東西,如果用來增加代碼閱讀難度,為了裝B強行寫垃圾代碼倒是個不錯的選擇。

Array.CreateInstance這個方法即可,不過這個方法感覺用來動態地創建數組不錯。其實知道就行了,一般也用不到,List<>簡單方便多了。

有下限的數組和下限未知的數組

CLR支持兩類數組,一類是一維0基數組,一類是下限未知的一維數組和多維數組

一般看數組的類型,比如0基數組的類型就是System.String[],非0基數組的類型為System.String[*].

訪問一維0基數組的元素比非0基或多維數組的元素稍快。因為有一些特殊IL指令處理一維0基數組,會導致JIT編譯器生成優化代碼。

所以其實交錯數組實際上是多個一維數組,也比多維數組的處理更快,所以也可以用交錯數組去替代多維數組去提高性能。

 

PS:

《CLR via C#》這章還介紹瞭如何去用不安全的方式去操作數組:

可以將數組不作為引用對象而是直接嵌入結構內部,

也可以用stackalloc語句去線上程棧上分配數組,而不是像之前一樣在堆上分配數組。

然而這種方式一般也就知道就好,主要用來和非托管代碼進行互操作。

因為是用unsafe方式啊,反正不到逼不得已我連想都不會想起來,麻煩,也不完全。

 


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

-Advertisement-
Play Games
更多相關文章
  • 思路 定義幾個類: HealthCheckItem類:檢查項目 屬性: HealthCheckItem類中的方法: 主界面: HealthCheckSet類:體檢套餐 屬性: HealthCheckSet類中的方法: 獲取價格的方法: 添加新套餐: 載入套餐下拉框信息: 初始化檢查項目: 添加檢查項 ...
  • 相信.Net開發人員都想能夠熟記各種VS快捷鍵以提高平時開發的效率,但苦於記憶能力太差而快捷鍵又特別多,特別煩,所以作罷! 下麵我將簡單介紹一下我記憶VS快捷鍵的一些方法,希望對大家有所幫助。 1、視窗快捷鍵 (大家有沒有發現但凡跟視窗掛上鉤的快捷鍵當中都有一個W,那是因為W代表Windows也就是 ...
  • 一、前言 對於WebForm開發,請求通常是一個以.aspx結尾的url,對應一個物理文件,從代碼的角度來說它其實是一個控制項(Page)。而在MVC中,一個請求對應的是一個Controller里的Action。熟悉asp.net的朋友都知道,asp.net請求實際都是交給HttpHandler處理( ...
  • [源碼下載] 背水一戰 Windows 10 (4) - UI: 多視窗 作者:webabcd介紹背水一戰 Windows 10 之 UI 多視窗 示例1、自定義幫助類,用於簡化 SecondaryView 的管理UI/MultipleViews/SecondaryViewHelper.cs 2、擴 ...
  • 語言的競爭從未消停。 但如果仔細發現,會看到所有的語言競爭都是這個模式: A. 我發現A語言有個X功能,寫起來特別爽,B語言就特別齪 B. 滾粗,B語言有Y功能,一樣可以YY A. 去,你根本不瞭解X功能,那才叫優雅 B. (自覺理虧)B語言還有Z優點, A語言就沒有! 仔細看看這段對話,沒錯,程式 ...
  • 想要實現文件放盜鏈的功能 首先添加一個全局文件 Global.asax 在 Application_BeginRequest中我們可以判斷Http報文頭中的UrlReferre是否來源本站。 ...
  • 先說一下VS解決方案中bin和obj這兩文件夾是什麼東東,以下信息源自百度。 bin目錄用來保存項目生成後程式集,它有Debug和Release兩個版本,分別對應的文件夾為bin/Debug和bin/Release,這個文件夾是預設的輸出路徑,我們可以通過:項目屬性—>配置屬性—>輸出路徑來修改。 ...
  • 在模型類Movie中添加一個新的屬性Rating 重新編譯重新生成解決方案,快捷鍵Ctrl+Shift+B;然後對去對應的視圖添加新的數據,如Index.cshtml中 編輯完成,運行之後系統報了一個異常:“System.InvalidOperationException”類型的異常在 Entity ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...