Какие модификаторы доступа могут применяться к классу?

После небольшого исследования я определил, что единственные модификаторы доступа, которые вы можете применить к классам:

  • публично - доступно в любой сборке
  • внутренний - доступен только в текущей сборке

но приведенное ниже сообщение об ошибке подразумевает, что если класс не определен в пространстве имен, его можно определить как частный, защищенный или защищенный внутренний.

Являются ли public и internal единственными модификаторами класса, которые вы можете использовать в классе, или их больше?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Test2343434
{
    class Program
    {
        static void Main(string[] args)
        {
            Tools.ToolManager toolManager = new Tools.ToolManager();

            Console.ReadLine();
        }
    }

}

namespace Tools
{
    //error: Elements defined in a namespace cannot be explicitly 
    //declared as private, protected, or protected internal
    private class ToolManager 
    {
        public ToolManager()
        {
            Console.WriteLine("inside tool manager");
        }
    }
}

4 ответа

Решение

Вложенный тип может быть объявлен закрытым, защищенным или защищенным внутренним. Разумеется, вы все равно можете объявить вложенные типы как публичные или внутренние - просто вы можете объявить их только с помощью указанных выше модификаторов доступа, когда они вложены:

public class OuterClass
{
    private class PrivateNested {}
    protected class ProtectedNested {}
    protected internal class ProtectedInternalNested {}
    public class PublicNested {}
    internal class InternalNested {}
}

Обратите внимание, что вы не можете объявить тип, вложенный в struct быть protected или же protected internal потому что это не имеет никакого смысла:)

public struct OuterStruct
{
    private class PrivateNested {}
    public class PublicNested {}
    internal class InternalNested {}
}

C# не позволяет типам вкладываться в интерфейсы (к сожалению, IMO - это было бы полезно для контрактов кода).

Все это верно и для других вложенных типов (перечисления, структуры, интерфейсы, делегаты).

Взгляните на эту страницу MSDN:

Объявления типов в пространстве имен могут иметь как открытый, так и внутренний доступ. Если доступность не указана, то по умолчанию используется значение internal.

Не имеет смысла, чтобы объявление типа в пространстве имен было чем-то иным, чем public для внешних сборок или внутренним (C# не поддерживает концепцию классов-друзей или что-то в этом роде).

Ответ находится в Уровни доступности.

Класс "верхнего уровня", т. Е. Не вложенный в другой класс, может быть только открытым или внутренним. По умолчанию (если вы ничего не декларируете) он является внутренним.

Вложенные классы могут иметь все пять возможных уровней доступности: открытый, защищенный, внутренний, закрытый, защищенный внутренний.

В контексте этого вопроса было бы интересно указать, что существует не очень хорошо известный механизм internal классы, видимые для других сборок. Этот механизм является атрибутом InternalsVisibleTo. Он не считается одним из модификаторов доступа, но имеет эффект манипулирования тем, кто имеет доступ. Концепция упоминается как дружеские собрания.

Другие вопросы по тегам