溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么在C#中地址只讀 Collections

發(fā)布時(shí)間:2021-04-12 15:48:55 來源:億速云 閱讀:118 作者:Leah 欄目:開發(fā)技術(shù)

本篇文章為大家展示了怎么在C#中地址只讀 Collections,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

集合 表示一組可用于獲取和存儲(chǔ)的對(duì)象,在 C# 中提供了兩種類型的集合。

  • 普通集合

  • 泛型集合

前者存在于 System.Collections 命名空間下,屬類型不安全的,后者存在于 System.Collections.Generic 命名空間下,屬類型安全的。

不可變對(duì)象 定義為一旦創(chuàng)建就不可變更的對(duì)象, 在 .NET Core 中就存在著這三大 IReadOnlyList,IReadOnlyDictionary 和 IReadOnlyCollection 不可變集合,這篇文章我們就來討論這些不可變集合以及在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),值得注意的是 只讀集合 只能通過 index 訪問,如下代碼所示:

    [DefaultMember("Item")]
    public interface IReadOnlyList<out T> : IEnumerable<T>, IEnumerable, IReadOnlyCollection<T>
    {
        T this[int index] { get; }
    }

使用 IReadOnlyList 替換 List

接下來我們看一下如何使用 IReadOnlyList 替換 List 來實(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();           
}

顯而易見上面的這種 authors 集合是我們用的最多的可變集合,那現(xiàn)在的問題是如何阻止 authors 被修改呢?這里就可以使用 IReadOnlyList 來確保 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"
      }
    };
}

接下來看一下 Main 下的 authors 是否有可添加的 Add() 方法?如下圖所示:

怎么在C#中地址只讀 Collections

使用 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)行索引訪問,那么可以轉(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 中提供了新的只讀接口可用于阻止集合的修改,不過值得注意的是,這些對(duì)數(shù)據(jù)提供只讀視圖的接口,本質(zhì)上來說也僅僅是高層的封裝而已。

上述內(nèi)容就是怎么在C#中地址只讀 Collections,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI