C# 中类的默认访问修饰符是 internal。但是在用 ildasm 检查班级时,它显示班级是私人的。
.class private auto ansi beforefieldinit ConsoleApplication1.Program
extends [mscorlib]System.Object
{
} // end of class ConsoleApplication1.Program
知道为什么吗?
IL 没有 的概念internal
,内部类被表示为private
好像它们位于根命名空间中,或者assembly
它们嵌套在另一个类型中。
namespace ConsoleApplication1
{
internal class ExplicitInternal
{
private class ExplicitPrivate
{
}
internal class ExplicitNestedInternal
{
}
public class ExplicitNestedPublic
{
}
}
public class ExplicitPublic
{
}
class ImplicitInternal
{
private class ImplicitPrivate
{
}
}
}
变成
.namespace ConsoleApplication1
{
.class private auto ansi beforefieldinit ConsoleApplication1.ExplicitInternal
extends [mscorlib]System.Object
{
.class nested private auto ansi beforefieldinit ExplicitPrivate
extends [mscorlib]System.Object
{
}
.class nested assembly auto ansi beforefieldinit ExplicitNestedInternal
extends [mscorlib]System.Object
{
}
.class nested public auto ansi beforefieldinit ExplicitNestedPublic
extends [mscorlib]System.Object
{
}
}
.class public auto ansi beforefieldinit ConsoleApplication1.ExplicitPublic
extends [mscorlib]System.Object
{
}
.class private auto ansi beforefieldinit ConsoleApplication1.ImplicitInternal
extends [mscorlib]System.Object
{
.class nested private auto ansi beforefieldinit ImplicitPrivate
extends [mscorlib]System.Object
{
}
}
}
默认访问修饰符的一般规则将是尽可能少的可访问性。 MSDN更详细:
直接在命名空间中声明的类和结构(换句话说,不嵌套在其他类或结构中)可以是公共的或内部的。如果未指定访问修饰符,则默认为 Internal 。结构成员,包括嵌套类和结构,可以声明为公共、内部或私有。类成员,包括嵌套类和结构,可以是公共的、受保护的内部的、受保护的、内部的或私有的。默认情况下,类成员和结构成员(包括嵌套类和结构)的访问级别是私有的。
...
作为字段、属性或事件的任何成员的类型必须至少与成员本身一样可访问。
因此,在 C# 中,这些是规则,但是我同意您正在处理的特定问题最终是由于内部在 IL 中没有意义的评论。
是内部类吗?那就私了。
默认情况下不能将类创建为私有,因为对于 soin,该类必须至少嵌套在另一个类中。ILDASM 向您展示该类是私有的,因为这意味着该类的范围仅限于其声明的类型。如果一个类没有在类型的定义中声明,那么它不能是该类型的私有。因此,嵌套类默认是私有的,而非嵌套类默认是内部的。如果您不添加一些访问权限修改,它会自动采用访问级别。方法
class Myclass1 {
class MyNestedClass
{
}
}
我一样喜欢
internal class Myclass1 {
private class MyNestedClass
{
}
}