索引器(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),也可以在访问器中加入验证逻辑。当你的类封装了一个集合,或者使用方括号表示法能让代码更易读时,索引器就很适合。
挑战
简单让我们来创建一个 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() 输出更新后的所有歌曲
}
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: C# 在线编译器