C#中类的默认访问修饰符

时间:2013-11-18 19:34:12

标签: c# ildasm

C#中类的默认Access修饰符是internal。 但是在使用ildasm检查类时,它将类显示为私有。

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

知道为什么吗?

4 个答案:

答案 0 :(得分: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
        {
        }
    }
}

答案 1 :(得分:3)

默认访问修饰符的一般规则将是可访问性最低的。 MSDN详细介绍:

  

直接在命名空间内声明的类和结构(in   换句话说,没有嵌套在其他类或结构中)可以   是公共的还是内部的。如果没有访问权限,内部是默认   修饰符已指定。 Struct成员,包括嵌套类和   结构,可以声明为public,internal或private。类   成员,包括嵌套类和结构,可以是公共的,   受保护的内部,受保护,内部或私人。访问级别   对于类成员和结构成员,包括嵌套类和   结构,默认为私有。

...

  

必须是字段,属性或事件的任何成员的类型   至少与会员本身一样容易接受。

所以在C#中这些是规则,但我同意评论,你正在处理的特定问题最终归因于内部having no meaning in IL.

答案 2 :(得分:1)

这是内部阶级吗?那将是私人的。

答案 3 :(得分:0)

默认情况下,Class不能创建为private,因为对于soin,该类必须至少嵌套在另一个类中。 ILDASM向您显示该类是私有的,因为它意味着该类的范围限于其声明的类型。 如果未在类型的定义中声明类,则它不能是该类型的私有。因此,默认情况下,嵌套类是私有的,而非嵌套类是默认的内部类。 如果你不添加一些访问修改它会自动采用访问级别。装置

class Myclass1 {
     class MyNestedClass
     {
     }
}

我喜欢

internal class Myclass1 {
     private class MyNestedClass
     {
     }
}

其他信息MSDN1MSDN2