Какие модификаторы доступа могут применяться к классу? - PullRequest
4 голосов
/ 21 июля 2010

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

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

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

Являются ли 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 ]

8 голосов
/ 21 июля 2010

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

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 - это было бы полезно для контрактов кода).

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

3 голосов
/ 21 июля 2010

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

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

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

3 голосов
/ 21 июля 2010

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

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

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

0 голосов
/ 21 июля 2010

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

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