如果我将一个类声明为内部的,为什么 IL 将其显示为私有的?
internal class Thing
.class private auto ansi beforefieldinit Thing.Thing
extends [mscorlib]System.Object
从 IL 的角度来看,private
这意味着程序集私有,即internal
在 C# 中。
在 C# 中,不可能将类型标记为private
好像它们不是嵌套的。IL 对此类类型的等效可访问性是nested private
.
所以我们有:
internal
-> IL's private
(到程序集)private
-> IL's nested private
(到封闭类型)在MSDN上,它说:
C# 关键字 protected 和 internal 在 IL 中没有任何意义,也不会在反射 API 中使用。IL 中对应的术语是 Family 和 Assembly。要使用反射识别内部方法,请使用 IsAssembly 属性。要识别受保护的内部方法,请使用 IsFamilyOrAssembly。
所以我想这只是让它们私有化,因为它们不能从其他地方访问。
编辑:我看到我的答案可能并不完全正确,我只是认为这是值得注意的。我链接的 MSDN 文章在“我们编写什么代码”-“它变成了什么”关系上有一些有趣的东西。
The mapping of C# keywords to IL keywords isn't always a logical one. Ecma-335, section II.23.1.15 shows what flags are valid for a type. You'll see that it only defines Public, NotPublic and a set of NestedXxx flags. Nothing similar to "internal". So your class is actually NotPublic, displayed as "private" in ildasm.
It is easy to see a side-effect of this: try this declaration in your C# code:
private class DoesNotWork {
}
You'll get:
error CS1527: Elements defined in a namespace cannot be explicitly declared as private, protected, or protected internal