You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

技术咨询: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逻辑:
    1. 检查内部的_dictionary是否存在"user123"这个key;
    2. 如果存在,直接返回对应的TValue;
    3. 如果不存在,用传入的_factory委托创建一个新的TValue实例,添加到字典里,再返回这个新实例。

和普通属性的区别:

  • 普通属性是访问单个固定值(比如public string Name { get; set; }),而索引器是基于参数动态访问不同的值;
  • 索引器可以重载(比如定义多个不同参数的this[...]),普通属性无法重载。

内容的提问来源于stack exchange,提问作者Christopher Pisz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:28:04