2013-11-18 4 views
1

Модификатор доступа по умолчанию для класса на C# является внутренним. Но при проверке класса с ildasm он показывает класс как закрытый.Модификатор доступа по умолчанию для класса в C#

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

Любая идея, почему?

+0

Кто говорит, что это внутреннее? – cwap

+2

Microsoft говорит, что это внутреннее: http://msdn.microsoft.com/en-us/library/ms173121.aspx – Magus

+0

Возможный дубликат [Когда я объявляю класс внутренним, почему IL показывает его как private?] (Http : //stackoverflow.com/questions/18660300/when-i-declare-a-class-as-internal-why-does-the-il-show-it-as-private) – Habib

ответ

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

+1, Вот ссылка на документацию http://msdn.microsoft.com/en-us/library/ms173183.aspx «Защищенные и внутренние ключевые слова C# не имеют смысла в IL и не используются в API-интерфейсах отражения». – Habib

3

Общее правило для модификатора доступа по умолчанию будет минимально доступным. MSDN переходит в более подробно:

Классы и структуры, объявленные непосредственно в пространстве имен (в Других слов, которые не вложены в других классах или структуры) могут быть либо публичными или внутренними. Внутренний - это значение по умолчанию, если не указан модификатор . Элементы Struct, включая вложенные классы и structs, могут быть объявлены как общедоступные, внутренние или частные. Классы , включая вложенные классы и структуры, могут быть общедоступными, защищены внутренними, защищенными, внутренними или частными. Уровень доступа для членов класса и членов структуры, включая вложенные классы и structs, является закрытым по умолчанию.

...

Тип любого элемента, который является полем, свойство или событие должно быть по крайней мере, доступны, как и сам член.

Таким образом, в C# эти правила, однако я согласен с комментариями о том, что конкретный вопрос вы имеете дело с, в конечном счете из-за внутренней having no meaning in IL.

+0

Вы должны подробно остановиться на этом и, возможно, предоставить некоторую соответствующую документацию –

+0

Другими словами, «внутренний», если это тип верхнего уровня (эффективно «сборка-частный») , и 'private', если это вложенный тип. –

+0

@MikeStrobel, то почему ildasm показывает класс как закрытый. – user1426187

1

Это внутренний класс? Тогда будет приватно.

0

Класс не может быть создан как закрытый по умолчанию, потому что для того, чтобы этот класс должен быть как минимум вложенным в другой класс. ILDASM показывает вам, что этот класс является приватным, потому что он означает, что класс ограничен по объему типу, в котором он объявлен. Если класс не объявлен внутри определения типа, он не может быть закрыт для этого типа. Таким образом, вложенные классы являются закрытыми по умолчанию, а не вложенные классы по умолчанию являются внутренними. Если вы не добавляете некоторые изменения доступа, он автоматически переходит на уровень доступа. означает

class Myclass1 { 
    class MyNestedClass 
    { 
    } 
} 

Я, так же, как

internal class Myclass1 { 
    private class MyNestedClass 
    { 
    } 
} 

Дополнительная информация MSDN1 и MSDN2

Смежные вопросы