1

C# 中类的默认访问修饰符是 internal。但是在用 ildasm 检查班级时,它显示班级是私人的。

.class private auto ansi beforefieldinit ConsoleApplication1.Program
    extends [mscorlib]System.Object
    {
    } // end of class ConsoleApplication1.Program

知道为什么吗?

4

4 回答 4

7

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
        {
        }
    }
}
于 2013-11-18T19:45:59.880 回答
3

默认访问修饰符的一般规则将是尽可能少的可访问性。 MSDN更详细:

直接在命名空间中声明的类和结构(换句话说,不嵌套在其他类或结构中)可以是公共的或内部的。如果未指定访问修饰符,则默认为 Internal 。结构成员,包括嵌套类和结构,可以声明为公共、内部或私有。类成员,包括嵌套类和结构,可以是公共的、受保护的内部的、受保护的、内部的或私有的。默认情况下,类成员和结构成员(包括嵌套类和结构)的访问级别是私有的。

...

作为字段、属性或事件的任何成员的类型必须至少与成员本身一样可访问。

因此,在 C# 中,这些是规则,但是我同意您正在处理的特定问题最终是由于内部在 IL 中没有意义的评论。

于 2013-11-18T19:36:27.513 回答
1

是内部类吗?那就私了。

于 2013-11-18T19:38:41.127 回答
0

默认情况下不能将类创建为私有,因为对于 soin,该类必须至少嵌套在另一个类中。ILDASM 向您展示该类是私有的,因为这意味着该类的范围仅限于其声明的类型。如果一个类没有在类型的定义中声明,那么它不能是该类型的私有。因此,嵌套类默认是私有的,而非嵌套类默认是内部的。如果您不添加一些访问权限修改,它会自动采用访问级别。方法

class Myclass1 {
     class MyNestedClass
     {
     }
}

我一样喜欢

internal class Myclass1 {
     private class MyNestedClass
     {
     }
}

附加信息MSDN1MSDN2

于 2013-11-18T19:44:54.187 回答