C#编译器如何生成文件局部类型中的长ID?
C#文件类反编译后的中间长标识生成逻辑
在使用C#的file类修饰符时,反编译后会发现类名被重命名为<源文件名><长十六进制标识>__<原类名>的格式,其中的长十六进制串是编译器为保证类名全局唯一而生成的源文件完整路径的SHA-256哈希值。
问题场景示例
原C#代码:
file class MyClass { } file class MyClass2 { } file class MyClass3 { public int MyMember { get; init; } }
反编译后的代码:
internal class <Class1>FFEAE62924BA736A3C9E8DE39EA3099D227B65B02C0A6BC7FECCB5FF0D5B9D8B3__MyClass { } internal class <Class1>FFEAE62924BA736A3C9E8DE39EA3099D227B65B02C0A6BC7FECCB5FF0D5B9D8B3__MyClass2 { } internal class <Class1>FFEAE62924BA736A3C9E8DE39EA3099D227B65B02C0A6BC7FECCB5FF0D5B9D8B3__MyClass3 { public int MyMember { get; init; } }
生成逻辑说明
- 该长标识是源文件完整路径(包含目录结构)的SHA-256哈希值的十六进制表示,完整的SHA-256哈希对应64个十六进制字符,与示例中的长度一致。
- 编译器生成该标识的核心目的是避免命名冲突:当项目中存在不同路径下的同名文件(比如两个不同目录里的
Class1.cs),它们的文件路径不同,哈希值也会不同,从而让各自定义的file类生成唯一的内部类名,确保编译时不会出现类型重复的错误。 - 这个哈希值会随源文件路径变化而变化,即使文件名相同但路径不同,生成的标识也会不一样。
内容的提问来源于stack exchange,提问作者winscripter
相关产品推荐
相关产品推荐

