如何在 C# 中找到生成的 "indexer" 代码?
How do I find the generated "indexer" code in C#?
我已阅读Indexer docs and I know that indexer will be translate to generate a property named "Item". I want to inspect the generated code but I can't find the process function of compiler how to generate it. Source Code search of 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#,您将取回索引器。 Indexed properties don't exist in C#.
我已阅读Indexer docs and I know that indexer will be translate to generate a property named "Item". I want to inspect the generated code but I can't find the process function of compiler how to generate it. Source Code search of 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#,您将取回索引器。 Indexed properties don't exist in C#.