技术咨询:C#中this[TKey key]是什么?非方法/变量/属性,如何工作?
这是C#中的索引器(Indexer)
你碰到的这个语法是C#里的索引器,它允许你让类的实例像数组那样通过方括号[]来访问内部元素,不需要定义单独的方法名,本质上是一种参数化的属性。
先拆解你代码里的这一行:
public TValue this[TKey key] => _dictionary.GetOrAdd(key, _factory);
这是一个只读索引器的简化写法(用了C#的表达式体语法=>),等同于完整的get访问器实现:
public TValue this[TKey key] { get { return _dictionary.GetOrAdd(key, _factory); } }
索引器的核心特点和工作原理:
- 没有单独名称:索引器用
this作为“标识”,因为它是针对当前类实例的索引访问,所以不需要额外命名。 - 参数化访问:和普通属性不同,索引器可以接收参数(这里的
TKey key),你可以通过不同的参数值来访问实例内部不同的元素。 - 你的代码里的具体逻辑:当你创建
EventStreamCollection的实例(比如var myCollection = new EventStreamCollection<string, MyEventStream>(key => new MyEventStream(key));),然后调用myCollection["user123"]时,会触发索引器的get逻辑:- 检查内部的
_dictionary是否存在"user123"这个key; - 如果存在,直接返回对应的
TValue; - 如果不存在,用传入的
_factory委托创建一个新的TValue实例,添加到字典里,再返回这个新实例。
- 检查内部的
和普通属性的区别:
- 普通属性是访问单个固定值(比如
public string Name { get; set; }),而索引器是基于参数动态访问不同的值; - 索引器可以重载(比如定义多个不同参数的
this[...]),普通属性无法重载。
内容的提问来源于stack exchange,提问作者Christopher Pisz
相关产品推荐
相关产品推荐

