索引器通过this关键字定义,允许对象像数组或字典一样使用[]访问内部数据;2. 其参数类型不限于int,可为string、guid或自定义类型,实现灵活的数据访问方式;3. 易忽略的细节包括边界检查(防止越界异常)、键不存在时的处理逻辑(返回null或抛异常)、性能影响(避免复杂操作)以及支持重载(不同参数列表的多个索引器)。

C#中的索引器(Indexer)提供了一种非常直观且类似数组的语法,允许我们通过指定一个或多个索引或键来访问对象内部的数据。它本质上让类的实例能够像数组或字典那样,使用方括号
[]
要实现一个索引器,你需要在类中定义一个特殊的成员,它看起来很像一个属性,但使用了
this
一个基本的索引器定义通常是这样的:
public class MyCollection
{
private string[] data = new string[10]; // 内部存储
// 定义一个索引器,允许通过整数索引访问
public string this[int index]
{
get
{
// 确保索引在有效范围内
if (index >= 0 && index < data.Length)
{
return data[index];
}
throw new IndexOutOfRangeException("索引超出范围。");
}
set
{
// 确保索引在有效范围内
if (index >= 0 && index < data.Length)
{
data[index] = value;
}
else
{
throw new IndexOutOfRangeException("索引超出范围。");
}
}
}
// 也可以定义一个只读的索引器
public string this[string key]
{
get
{
// 假设这里有一个更复杂的查找逻辑,比如根据字符串键查找
// 为了示例简单,这里直接返回一个固定值
if (key == "first") return data[0];
if (key == "last") return data[data.Length - 1];
return null; // 或者抛出异常
}
}
}在使用时,就像操作数组一样:
MyCollection collection = new MyCollection(); collection[0] = "Hello"; // 使用set访问器 string item = collection[0]; // 使用get访问器 Console.WriteLine(item); // 输出: Hello // 使用字符串索引器 string firstItem = collection["first"]; Console.WriteLine(firstItem); // 输出: Hello
这里的
this
get
set
value
set
我个人觉得,很多人刚接触索引器时,会下意识地把它和属性混淆。但实际上,它们的设计哲学是完全不同的。属性(Property)是为了封装一个单一的、命名明确的数据成员,比如一个人的
Name
Price
.
而索引器呢,它的核心是提供一种“集合式”的访问模式。它没有一个具体的名称,而是通过
this
举个例子,你不会有一个属性叫
MyObject.Item[0]
MyObject.FirstItem
MyObject.CurrentItem
MyObject
MyObject[N]
这点其实挺有意思的,它让索引器远比想象中灵活。索引器参数的类型并不局限于
int
string
Guid
例如,如果你正在构建一个配置管理器类,你可能希望通过配置项的名称(字符串)来访问其值:
public class ConfigurationManager
{
private Dictionary<string, string> settings = new Dictionary<string, string>();
public string this[string key]
{
get
{
if (settings.ContainsKey(key))
{
return settings[key];
}
// 考虑返回null、抛出异常或返回默认值
return null;
}
set
{
settings[key] = value;
}
}
}这样,你就可以写
ConfigurationManager config = new ConfigurationManager(); config["DatabaseConnection"] = "connection_string";
说实话,我见过不少新手在写索引器时,直接就忽略了一些关键的细节,结果一运行就炸。这些细节看似简单,却是决定代码健壮性的关键。
一个最常见的疏忽是边界检查。特别是当你的索引器使用
int
IndexOutOfRangeException
另一个常被忽略的点是对非int
string
get
null
KeyNotFoundException
null
还有,性能考量。虽然索引器语法简洁,但它背后执行的逻辑可能并不简单。如果你的
get
set
最后,别忘了索引器也是可以重载的。你可以为一个类定义多个索引器,只要它们的参数列表(类型和数量)不同就行。这使得你可以通过不同的“维度”或“键类型”来访问同一份数据,比如一个
this[int index]
this[string name]
以上就是C#的索引器(Indexer)如何实现类似数组的访问?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号