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

C# 唯讀集合最佳實踐:ReadOnlyCollection<T> 封裝模式與應用場景

     編輯:關於C語言

前言

類別庫設計中常見需求:內部集合需對外公開供讀取,但禁止外部修改。直接公開 List<T> 會破壞封裝;回傳陣列 T[] 需複製且失去介面豐富度。ReadOnlyCollection<T> 為此提供標準解決方案:包裝任意 IList<T>,暴露唯讀介面,零複製成本。

核心範例:Lottery 類別

public class Lottery
{
    private List<int> _numbers = null;

    public Lottery()
    {
        _numbers = new List<int>(5);
        _numbers.Add(17);
        _numbers.Add(21);
        _numbers.Add(32);
        _numbers.Add(44);
        _numbers.Add(58);
    }

    public ReadOnlyCollection<int> Results
    {
        get { return new ReadOnlyCollection<int>(_numbers); }
    }
}

使用者端程式碼

var lottery = new Lottery();

// 讀取 - 完全正常
for (int i = 0; i < lottery.Results.Count; i++)
    Console.WriteLine($"Lottery Number {i} is {lottery.Results[i]}");

// 寫入 - 編譯期錯誤
// lottery.Results[0] = 29; // CS0200: Property or indexer '...' cannot be assigned to -- it is read only

ReadOnlyCollection<T> 核心特性

特性說明
包裝目標任意實作 IList<T> 的集合(List<T>、陣列 T[]、自訂集合)
介面實現IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable
修改操作所有 Add/Remove/Clear/Insert/this[].set 拋出 NotSupportedException
讀取操作Count, IndexOf, Contains, this[].get, GetEnumerator 正常運作
底層資料共享同一陣列/清單,非複製,修改底層集合會反映到唯讀檢視
建構成本O(1),僅建立包裝物件

包裝陣列範例

int[] items = { 0, 1, 2 };
var readOnly = new ReadOnlyCollection<int>(items);
// readOnly[0] = 9; // 編譯錯誤
// items[0] = 9;    // 允許,且 readOnly[0] 會變為 9

設計模式:唯讀屬性標準化

public class Repository
{
    private List<Entity> _entities = new List<Entity>();

    // 公開唯讀檢視
    public IReadOnlyList<Entity> Entities => new ReadOnlyCollection<Entity>(_entities);
    
    // 或 .NET 4.5+ 直接使用 IReadOnlyList<T> 介面
    // public IReadOnlyList<Entity> Entities => _entities.AsReadOnly(); // List 擴充方法
}

優勢:

  1. 統一回傳型別 IReadOnlyList<T> / ReadOnlyCollection<T>,呼叫端無需學習多種 API
  2. 內部可自由變更儲存結構(List、LinkedList、陣列),不影響公開介面
  3. 編譯期保護,杜絕誤寫入

進階:真正的不可變集合

若需「底層資料也不得修改」的深度不可變性,請使用 System.Collections.Immutable (NuGet) 提供的 ImmutableList<T>、ImmutableDictionary<TKey, TValue> 等。修改操作會回傳新實例,結構共享保證效能。

總結

ReadOnlyCollection<T> 是 .NET 框架提供的標準唯讀包裝器,以「零複製、介面完整、編譯期保護」三大優勢,成為類別庫公開集合屬性的最佳實踐。配合 IReadOnlyList<T> 介面(.NET 4.5+),可構建清晰、安全、可演進的 API 介面契約。

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