c# - 如何在 C# 中找到生成的“索引器”代码?
问题描述
我已经阅读了Indexer 文档,并且我知道 indexer 将被翻译以生成一个名为“Item”的属性。我想检查生成的代码,但找不到编译器的处理函数如何生成它。C#的源代码搜索
解决方案
在 C# 中,属性 getter 不接受任何参数,而 setter 只接受一个参数,因此编译器几乎不可能为索引器生成C#属性(在 C# 意义上)。如果您希望找到声明名为 的属性的 C# 代码Item
,您将找不到。
编译器生成的是 IL,这就是文档的意思——IL 意义上的“属性”。IL 具有索引属性,这就是索引器翻译的内容。例如,这样的索引器:
public class Foo
{
public string this[int index]
{
get => "";
set {}
}
}
转换为(在SharpLab上玩这个!):
.method public hidebysig specialname
instance string get_Item (
int32 index
) cil managed
{
// Method begins at RVA 0x2050
// Code size 6 (0x6)
.maxstack 8
IL_0000: ldstr ""
IL_0005: ret
} // end of method Foo::get_Item
.method public hidebysig specialname
instance void set_Item (
int32 index,
string 'value'
) cil managed
{
// Method begins at RVA 0x2057
// Code size 2 (0x2)
.maxstack 8
IL_0000: nop
IL_0001: ret
} // end of method Foo::set_Item
// Properties
.property instance string Item(
int32 index
)
{
.get instance string Foo::get_Item(int32)
.set instance void Foo::set_Item(int32, string)
}
请注意,该Item
属性“接受一个参数”。还有一个DefaultMemberAttribute
添加(上面没有显示)。
将最后一部分与普通 C# 属性转换为的内容进行比较:
.property instance string Item()
{
.get instance string Foo::get_Item()
.set instance void Foo::set_Item(string)
}
请注意,如果您将 IL 代码翻译回 C#,您将获得索引器。C# 中不存在索引属性。
推荐阅读
- postgresql - 将 postgres 表主键 UUID 更改为 Character Varying
- data-structures - TCL/ITCL - 使用现有数据结构实现独特的数据结构
- android - BottomSheet 动画持续时间
- typescript - 有没有办法将 `jsdoc` 与 `.ts` 文件一起使用?也许用 babel 转译然后使用 jsdoc?
- angular - 无法从 nativescript worker 访问角度服务
- javascript - 限制输入 0.00 - javascript
- python - 如何让“python -m venv”直接安装最新的 pip 版本
- mysql - 添加新行后如何在数据库表中自动排序 ID?
- simple-html-dom - 使用简单的 html dom 解析 html 的逻辑
- vuejs2 - 即使在重新加载页面后也使侧边栏子菜单处于活动状态