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 に答える
0

デフォルトでは、クラスをプライベートとして作成することはできません。これは、そのクラスが少なくとも別のクラス内にネストされている必要があるためです。ILDASM は、クラスが宣言された型にスコープが制限されていることを意味するため、クラスがプライベートであることを示しています。クラスが型の定義内で宣言されていない場合、その型に対してプライベートにすることはできません。したがって、ネストされたクラスはデフォルトでプライベートですが、ネストされていないクラスはデフォルトで内部です。アクセス権の変更を追加しない場合は、アクセス レベルに自動的に適用されます。意味

class Myclass1 {
     class MyNestedClass
     {
     }
}

私も同じように

internal class Myclass1 {
     private class MyNestedClass
     {
     }
}

追加情報MSDN1 およびMSDN2

于 2013-11-18T19:44:54.187 に答える