如何在C#中使用只讀的 Collections
集合 表示一組可用于獲取和存儲(chǔ)的對(duì)象,在 C# 中提供了兩種類型的集合。
- 普通集合
- 泛型集合
前者存在于 System.Collections 命名空間下,屬類型不安全的,后者存在于 System.Collections.Generic 命名空間下,屬類型安全的。
不可變對(duì)象 定義為一旦創(chuàng)建就不可變更的對(duì)象, 在 .NET Core 中就存在著這三大 IReadOnlyList,IReadOnlyDictionary 和 IReadOnlyCollection 不可變集合,這篇文章我們就來(lái)討論這些不可變集合以及在C#中如何使用。
三大只讀類型介紹
IReadOnlyCollection 表示一個(gè)只讀集合的基礎(chǔ)接口,它實(shí)現(xiàn)了 IEnumerable 接口,代碼定義如下:
public interface IReadOnlyCollection<out T> : IEnumerable<T>, IEnumerable { int Count { get; } }
IReadOnlyDictionary 表示一個(gè)字典的只讀形態(tài),它實(shí)現(xiàn)了基礎(chǔ)的只讀集合接口 IReadOnlyCollection, 下面的代碼展示了如何將 泛型字典 只讀化。
public IReadOnlyDictionary<string, string> Dictionary { get; } = new Dictionary<string, string> { { "1", "ABC" }, { "2", "XYZ" }, { "3", "PQR" }, };
IReadOnlyList 表示一個(gè)列表的只讀形態(tài),值得注意的是 只讀集合 只能通過(guò) index 訪問(wèn),如下代碼所示:
[DefaultMember("Item")] public interface IReadOnlyList<out T> : IEnumerable<T>, IEnumerable, IReadOnlyCollection<T> { T this[int index] { get; } }
使用 IReadOnlyList 替換 List
接下來(lái)我們看一下如何使用 IReadOnlyList 替換 List 來(lái)實(shí)現(xiàn)列表的只讀化,考慮下面的類。
public class Author { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } }
假如你想從數(shù)據(jù)庫(kù)中返回 author 集合,使用如下代碼:
public static List<Author> GetAuthors() { return new List<Author> { new Author { Id = 1, FirstName = "Joydip", LastName = "Kanjilal" }, new Author { Id = 2, FirstName = "Steve", LastName = "Smith" } }; }
為了簡(jiǎn)化,我省略了對(duì)數(shù)據(jù)庫(kù)繁瑣的操作,下面的代碼展示了如何在 Main 方法中調(diào)用 GetAuthors() 方法。
static void Main(string[] args) { var authors = GetAuthors(); Console.Read(); }
顯而易見(jiàn)上面的這種 authors 集合是我們用的最多的可變集合,那現(xiàn)在的問(wèn)題是如何阻止 authors 被修改呢?這里就可以使用 IReadOnlyList 來(lái)確保 GetAuthors() 方法返回的集合不可更變,做法就是將方法的返回值從 List<Author> 修改為 IReadOnlyList<Author>,如下代碼所示。
public static IReadOnlyList<Author> GetAuthors() { return new List<Author> { new Author { Id = 1, FirstName = "Joydip", LastName = "Kanjilal" }, new Author { Id = 2, FirstName = "Steve", LastName = "Smith" } }; }
接下來(lái)看一下 Main 下的 authors 是否有可添加的 Add() 方法?如下圖所示:
使用 IEnumberable 接口
不知道大家可否發(fā)現(xiàn),現(xiàn)存的只讀接口都繼承了 IEnumberable,這就意味著 IEnumberable 也是一種只讀形態(tài),如果你只需要對(duì)集合進(jìn)行迭代,那么就可以使用 IEnumberable 接口啦,如下代碼所示:
public void MyMethod(IEnumerable<Author> authors) { foreach (Author author in authors) { //Write your code here } }
如果需求不滿足,可以對(duì) IEnumerable 繼續(xù)向下轉(zhuǎn)型,比如想對(duì)集合進(jìn)行索引訪問(wèn),那么可以轉(zhuǎn)成 IReadOnlyList 接口,盡量滿足 可用功能的最小化 ,改造后的代碼如下:
public void MyMethod(IReadOnlyList<Author> authors) { int count = authors.Count; for(int index = 0; index < count; index++) { var author = authors[index]; //Write your code here } }
IEnumerable 是 .NET 較早版本可用于只讀集合形態(tài)的接口, 在 .NET Core 中提供了新的只讀接口可用于阻止集合的修改,不過(guò)值得注意的是,這些對(duì)數(shù)據(jù)提供只讀視圖的接口,本質(zhì)上來(lái)說(shuō)也僅僅是高層的封裝而已。
以上就是如何在C#中使用只讀的 Collections的詳細(xì)內(nèi)容,更多關(guān)于C#中使用只讀的 Collections的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#中FormClosing與FormClosed的區(qū)別詳細(xì)解析
本文是對(duì)C#中FormClosing與FormClosed的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-10-10使用C#實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)堆的代碼
這篇文章主要介紹了使用C#實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)堆,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02C#實(shí)現(xiàn)ComboBox控件顯示出多個(gè)數(shù)據(jù)源屬性的方法
這篇文章主要介紹了C#實(shí)現(xiàn)ComboBox控件顯示出多個(gè)數(shù)據(jù)源屬性的方法,實(shí)例分析了ComboBox控件的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09C#使用zxing/zbar/thoughtworkQRcode解析二維碼的示例代碼
zxing是谷歌開(kāi)源的二維碼庫(kù),zbar,thoughtworkQRcode也是開(kāi)源的,三者之間比較各有優(yōu)劣,本文將通過(guò)一個(gè)案例demo源碼,帶來(lái)認(rèn)識(shí)學(xué)習(xí)下這三者的實(shí)際解碼效果,感興趣的可以了解一下2023-07-07Unity 按鈕事件封裝操作(EventTriggerListener)
這篇文章主要介紹了Unity 按鈕事件封裝操作(EventTriggerListener),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04C#的FileInfo類實(shí)現(xiàn)文件操作實(shí)例
這篇文章主要介紹了C#的FileInfo類實(shí)現(xiàn)文件操作實(shí)例,比較實(shí)用的功能,需要的朋友可以參考下2014-07-07C# 動(dòng)態(tài)輸出Dos命令執(zhí)行結(jié)果的實(shí)例(附源碼)
這篇文章主要介紹了C# 動(dòng)態(tài)輸出Dos命令執(zhí)行結(jié)果的實(shí)例,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07