首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

CLR 筆記:陣列完整指南——從基礎到高效能存取

     編輯:關於.NET

陣列基礎

CLR 支援一維、多維、交錯陣列。宣告不指定長度;new 時指定長度。Array 型別宣告較靈活但非型別安全;String[] 型別安全。所有陣列隱式繼承 System.Array(繼承自 System.Object),故陣列為引用類型。

  • 值類型陣列 new 時建立實際物件,元素初始化為 0。
  • 引用類型陣列 new 時僅建立參考,不建立實際物件。
  • CLS 要求零基陣列。
  • 每個陣列關聯額外資訊(Overhead)。
  • JIT 僅在迴圈執行前檢查一次邊界,非每次迭代皆檢查。

13.1 陣列型別轉換

  • 引用類型陣列:維度相同,且源元素類型到目標元素類型存在隱式(向基底轉)或顯式(向衍生轉)轉換。
  • 值類型陣列:不可轉換為其他任何類型——改用 Array.Copy。Array.Copy 復制時可進行必要型別轉換:值類型裝箱、引用類型拆箱、基元類型擴寬、不相容類型向下轉換。
  • 陣列協變性:轉換會有效能損失,執行期可能報錯(如 Object[] oa = new String[100]; oa[3] = 1; 拋出例外)。
  • 僅需複製元素時,可用 System.Buffer.BlockCopy(僅支援基元類型,無轉型能力,速度較快)。

13.3 陣列隱式實作介面

  • 一維零基引用類型陣列自動實作 IEnumerable<T>、ICollection<T>、IList<T>,並為所有基底類型 B 實作對應介面(如 FileStream[] 可傳給 IList<Stream>)。
  • 一維零基值類型陣列僅為自身類型 T 實作上述介面,不為基底類型實作(如 DateTime[] 不可傳給 IEnumerable<Object>)。

13.4 陣列傳遞與回傳

Array.Copy 為淺層複製。陣列宜用零長度而非 null。

13.5 非零基陣列

使用 Array.CreateInstance 多載指定元素類型、維度、下界、各維長度。可用 GetLowerBound/GetUpperBound 取得邊界。一維陣列可用 GetValue/SetValue 操作(較慢)。

13.6 陣列存取效能

  • 一維零基陣列型別如 String[];非零基為 String[*];多維陣列皆為 String[,](執行期視為非零基)。
  • 一維零基陣列存取最快:有專用 IL 指令(無需減去偏移量),JIT 將索引範圍檢查移出迴圈僅執行一次。
  • for 迴圈中 Length 屬性經 JIT 快取,不重複計算。將 Length 存入區域變數反而損害效能。
  • 非零基/多維陣列每次迭代皆檢查範圍並減去下界,效能較差。

提升效能兩招: 用交錯陣列取代多維陣列;用非安全程式碼存取非零基陣列(關閉邊界檢查,僅限基元值類型)。文中附非安全存取二維陣列完整範例。

13.7 非安全陣列與內嵌陣列

  • 非安全陣列可存取託管堆、非託管堆、執行緒堆疊上的陣列。
  • 效能優先時,避免堆上配置,改用 stackalloc 在執行緒堆疊配置(僅限一維零基值類型陣列,且值類型不可含引用類型)。範例:stackalloc 反轉字串。
  • 結構中內嵌陣列需:unsafe 標記結構、fixed 標記欄位、一維零基、基元值類型。範例:fixed Char Characters[20] 反轉字串。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved