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

全面認識 C#(七-八):集合與 foreach、結構值型別

     編輯:C# 入門

七、集合與 foreach 陳述式

統一迭代語法

C# foreach 可迭代任何實作 IEnumerable/IEnumerable<T> 的型別,陣列隱含實作。

語法比較

語言集合迭代陣列迭代
Java/C++
while (!coll.isEmpty()) {
    Object o = coll.get();
    coll.next();
}
for (int i=0; i
C#foreach (var item in collection) { ... }foreach (var item in array) { ... }

運作原理


// 編譯器轉換為 (簡化版)
IEnumerator enumerator = collection.GetEnumerator();
try {
    while (enumerator.MoveNext()) {
        T item = enumerator.Current;
        // loop body
    }
}
finally {
    (enumerator as IDisposable)?.Dispose();
}

自訂迭代器


public class Fibonacci : IEnumerable {
    public IEnumerator GetEnumerator() => new FibonacciEnumerator();
    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();

    private class FibonacciEnumerator : IEnumerator {
        int _prev = 0, _curr = 1;
        public int Current => _prev;
        object IEnumerator.Current => Current;
        public bool MoveNext() {
            (_prev, _curr) = (_curr, _prev + _curr);
            return true; // 無限序列
        }
        public void Reset() => (_prev, _curr) = (0, 1);
        public void Dispose() { }
    }
}

// 使用
foreach (int n in new Fibonacci().Take(10)) Console.WriteLine(n);

八、結構 - 輕量級值型別

核心差異:類別 vs 結構

特性類別 (參考型別)結構 (值型別)
記憶體配置堆積堆疊 / 內嵌於包含型別
指派語意參考複製值複製
預設值null零值 (所有欄位為 0/null)
繼承支援繼承不可繼承 (隱含 sealed)
介面實作支援支援
解構子有 (Finalize)無
null 可用性可為 null不可為 null (除非 Nullable<T>)

宣告與使用


public struct Vector3 {
    public float X, Y, Z;
    public Vector3(float x, float y, float z) => (X, Y, Z) = (x, y, z);
    public float Magnitude => MathF.Sqrt(X*X + Y*Y + Z*Z);
    public static Vector3 operator +(Vector3 a, Vector3 b) 
        => new Vector3(a.X+b.X, a.Y+b.Y, a.Z+b.Z);
}

// 使用
Vector3 v1 = new Vector3(1, 2, 3);
Vector3 v2 = v1; // 值複製
v2.X = 10;     // v1 不受影響
Vector3[] vectors = new Vector3[1000]; // 連續記憶體區塊,單一配置

效能優勢

  • 陣列連續配置:Vector3[1000] 為單一記憶體區塊,無 1000 個獨立物件標頭
  • 無 GC 壓力:堆疊配置、內嵌欄位不產生垃圾
  • 快取友善:資料局部性極佳,適合高效能計算、圖形、遊戲

基本型別即結構


int i = 5;
Console.WriteLine(i.ToString()); // int 為 System.Int32 結構別名
long l = 10L; // System.Int64
double d = 3.14; // System.Double
// 所有基本型別皆為結構別名

裝箱與拆箱


int i = 42;
object boxed = i;        // 裝箱:配置物件包裝值
int unboxed = (int)boxed; // 拆箱:提取值

// 概念模型
class Int32Box { public int Value; Int32Box(int v) => Value = v; }
object boxed2 = new Int32Box(42); // 裝箱相當於
int unboxed2 = ((Int32Box)boxed2).Value; // 拆箱相當於

避免裝箱最佳實務

  • 使用泛型集合 List<int> 而非 ArrayList
  • 介面參數改用泛型 IComparable<T> 而非 IComparable
  • 避免在熱路徑將值型別傳給 object 參數

總結

foreach 統一了集合與陣列的迭代語法,結構提供高效能值型別語意。理解值/參考語意差異、裝箱拆箱機制、避免不必要配置,是寫出高效能 C# 程式碼的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved