Menu
CoddyTech

索引器(this[])

本课属于 Coddy C# 学习旅程的“面向对象编程”单元。第 37 课,共 70 课。

索引器让你可以使用类似数组的方括号表示法访问类中的元素。你不必调用像 collection.GetItem(0) 这样的方法,而是可以写更直观的 collection[0]。

你可以使用 this 关键字和方括号来定义索引器:

public class Sentence
{
    private string[] words;
    
    public Sentence(string text)
    {
        words = text.Split(' ');
    }
    
    public string this[int index]
    {
        get { return words[index]; }
        set { words[index] = value; }
    }
}

现在你可以自然地访问单词了:

Sentence s = new Sentence("Hello World");
Console.WriteLine(s[0]);  // Hello
s[1] = "C#";
Console.WriteLine(s[1]);  // C#

索引器的索引不局限于整数。你可以使用任何类型作为索引参数,这样就能像访问字典一样访问数据:

public string this[string key]
{
    get { return dictionary[key]; }
    set { dictionary[key] = value; }
}

与属性一样,索引器可以是只读的(省略 setter),也可以在访问器中加入验证逻辑。当你的类封装了一个集合,或者使用方括号表示法能让代码更易读时,索引器就很适合。

challenge icon

挑战

简单

让我们来创建一个 Playlist 类,让你可以像使用数组一样,通过直观的方括号表示法访问歌曲。你将创建一个音乐播放列表,并通过索引器按位置获取和更新歌曲。

你将把代码分到两个文件中:

  • Playlist.cs:在 Music 命名空间中创建一个 Playlist 类,用它封装歌曲集合,并通过索引器提供类似数组的访问方式。你的播放列表应包含:
    • 一个用于存储歌曲名称的私有字符串数组
    • 一个接收以逗号分隔的歌曲名称字符串,并将其拆分到内部数组中的构造函数
    • 一个使用 this[int index] 的索引器,用于获取和设置指定位置的歌曲
    • 一个只读属性 Count,用于返回播放列表中的歌曲数量
    • 一个 GetAllSongs() 方法,用于返回以 " | " 拼接的所有歌曲
  • Program.cs:在主文件中,根据输入创建播放列表,然后使用索引器访问和修改歌曲。演示如何通过索引读取歌曲,以及如何更新指定位置的歌曲。

你将收到三个输入:

  • 以逗号分隔的歌曲名称列表(例如,Song A,Song B,Song C)
  • 要获取的索引(整数)
  • 用于替换该索引位置歌曲的新歌曲名称

请按以下格式输出:

Total songs: {Count}
Song at index {index}: {song title}
After update: {GetAllSongs()}

例如,如果输入是 Rock Anthem,Jazz Vibes,Pop Hit、1 和 Blues Classic,输出应为:

Total songs: 3
Song at index 1: Jazz Vibes
After update: Rock Anthem | Blues Classic | Pop Hit

注意,索引器让你可以通过 playlist[1] 获取 "Jazz Vibes",然后使用 playlist[1] = "Blues Classic" 更新它。这样比调用 GetSongAt(1) 或 SetSongAt(1, "Blues Classic") 这样的方法自然得多!

亲手试试

using System;
using Music;

class Program
{
    public static void Main(string[] args)
    {
        // 读取输入
        string songList = Console.ReadLine();
        int index = Convert.ToInt32(Console.ReadLine());
        string newSong = Console.ReadLine();

        // TODO:根据 songList 创建 Playlist 对象

        // TODO:使用 Count 属性输出歌曲总数

        // TODO:使用索引器输出给定索引处的歌曲

        // TODO:使用索引器更新给定索引处的歌曲

        // TODO:使用 GetAllSongs() 输出更新后的所有歌曲
    }
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: C# 在线编译器