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

C# 2.0 泛型實戰入門:自定義泛型集合類完整實現

     編輯:關於C語言

前言:泛型帶來的革命

C# 2.0 引入泛型,解決了 1.x 時代 `ArrayList` 等非泛型集合的裝箱/拆箱性能損耗與類型安全缺失問題。本文通過實現一個簡易泛型列表 `BList`,演示泛型類定義、索引器、方法、屬性的核心語法與用法。

泛型類定義:BList<T>

using System;
using System.Collections; // 僅為內部使用 ArrayList 演示,實際建議用 T[]

namespace WindowsApplication1
{
    public class BList<T>
    {
        // 內部存儲 (教學演示用 ArrayList,生產環境應用 T[] + 動態擴容)
        private readonly ArrayList _innerList = new ArrayList();

        // 索引器:提供類數組訪問體驗
        public T this[int index]
        {
            get
            {
                // 運行時類型檢查,若 T 為值類型會發生拆箱
                return (T)_innerList[index];
            }
            set
            {
                // 添加或替換邏輯:此處簡化為 Add,實際應按索引插入/替換
                _innerList.Add(value);
            }
        }

        // 添加方法
        public void Add(T item) => _innerList.Add(item);

        // 數量屬性
        public int Count => _innerList.Count;
    }
}

調用示例:類型安全與性能


private void button2_Click(object sender, EventArgs e)
{
    // 1. 實例化指定類型參數 (此處為 int)
    BList<int> list = new BList<int>();
    // BList<string>, BList<Customer> 等同理

    // 2. 添加元素 - 編譯期強制類型檢查
    for (int i = 0; i < 10; i++)
    {
        list.Add(i); // 僅接受 int,傳入 string 將編譯報錯
    }

    // 3. 遍歷訪問 - 無裝箱拆箱,直接返回 int
    for (int i = 0; i < list.Count; i++)
    {
        int value = list[i]; // 直接獲取 int,無需 (int) 轉換
        MessageBox.Show(value.ToString());
    }
}

核心優勢對比

特性ArrayList (非泛型)BList<T> / List<T> (泛型)
類型安全運行時發現類型錯誤編譯期強制檢查
值類型性能每次 Add/Get 發生裝箱/拆箱零裝箱,直接存儲值
代碼復用單一 Object 版本一份代碼服務所有類型
可讀性需大量轉型類型意圖清晰

進階泛型特性預覽

約束


// 要求 T 實現 IComparable,可調用 CompareTo
public class SortedList<T> where T : IComparable<T> { ... }

// 要求 T 有公共無參構造函數
public class Factory<T> where T : new() { ... }

// 要求 T 為引用類型 / 值類型
public class RefWrapper<T> where T : class { ... }
public class ValWrapper<T> where T : struct { ... }

泛型接口與委托

public interface IRepository<T> { void Add(T entity); T GetById(int id); }
public delegate TResult Func<in T, out TResult>(T arg); // 協變/逆變

泛型方法


public void Swap<T>(ref T a, ref T b) { T temp = a; a = b; b = temp; }
// 調用:Swap<int>(ref x, ref y); 或 Swap(ref x, ref y); (類型推斷)

最佳實踐建議

  1. 優先使用 `List`:框架提供的 `List` 完整實現動態擴容、索引器、枚舉器、排序、搜索等,性能經過優化
  2. 命名慣例:類型參數用單一大寫字母 (`T`, `TKey`, `TValue`) 或以 `T` 開頭的描述性名稱 (`TEntity`)
  3. 避免不必要的泛型:若類內部不涉及類型參數的具體操作,考慮非泛型基類 + 泛型子類
  4. 理解型變:`out` (協變, 返回位置)、`in` (逆變, 參數位置) 用於接口/委托,實現類型安全的多態賦值

總結

泛型是 C# 類型系統的基石。通過 `BList` 示例,展示了泛型類定義、索引器、方法、屬性的基本語法。實際開發中請直接使用 `System.Collections.Generic.List` 等成熟集合,核心價值在於編譯期類型安全 + 值類型零裝箱高性能 + 代碼復用。掌握約束、型變、泛型方法等進階特性,能構建更靈活、健壯的類庫 API。

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