当我将一个类声明为内部时,为什么IL将其显示为私有?
如果我将一个类声明为内部类,为什么IL将其显示为私有?
internal class Thing .class private auto ansi beforefieldinit Thing.Thing extends [mscorlib]System.Object
从IL的角度来看, private
意味着组装私有 ,即C# internal
。
在C#中,如果类型不是嵌套的 ,则无法将类型标记为private
。 IL对这些类型的等效可访问性是nested private
。
所以我们有:
- C#的
internal
– > IL的private
(对程序集) - C#的
private
– > IL的nested private
(到封闭类型)
在MSDN上 ,它说:
C#关键字protected和internal在IL中没有任何意义,并且不在reflectionAPI中使用。 IL中的相应术语是Family和Assembly。 要使用reflection标识内部方法,请使用IsAssembly属性。 要标识受保护的内部方法,请使用IsFamilyOrAssembly。
所以我想它只是让它们变得私密,因为它们无法从其他地方访问。
编辑:我看到我的答案可能不完全正确,我只是认为这是值得注意的事情。 我链接的MSDN文章在这个“我们编写的代码” – “它变成什么样”的关系中有一些有趣的东西。
C#关键字到IL关键字的映射并不总是合乎逻辑的。 Ecma-335,第II.23.1.15节显示了哪种标志对一种类型有效。 你会看到它只定义了Public,NotPublic和一组NestedXxx标志。 没有类似于“内部”的东西。 所以你的class级实际上是NotPublic,在ildasm中显示为“私人”。
很容易看到这样的副作用:在C#代码中尝试此声明:
private class DoesNotWork { }
你会得到:
错误CS1527:命名空间中定义的元素不能显式声明为private,protected或protected internal