С помощью модификаторов доступа можно ограничить доступ к типу или отдельному его члену из других типов и сборок. Модификатор добавляется к объявлению типа или его члена.
Всего доступно пять модификаторов доступа:
public— полный доступ. Это значение по умолчанию для членовenumи интерфейсов.internal— доступ только в пределах сборки или дружеских сборок. Это значение по умолчанию для не вложенных типов.private— доступ только в пределах типа. Это значение по умолчанию для членов класса или структуры.protected— доступ только в пределах типа и производных классов.protected internal— симбиозprotectedиinternal. Расширяет оба модификатора и делает тип или его член доступным в пределах типа, производных классов, сборки и дружеских сборок.
1 2 3 4 | class Class1 {} // Class1 - internal (по умолчанию) public class Class2 {} class ClassA { int x; } // x - private (по умолчанию) class ClassB { internal int x; } |
Дружественные сборки (Friend Assemblies)
Дружественная сборка — сборка, которая может обращаться к internal типам и членам другой сборки. Если сборка определена как дружественная, больше нет необходимости помечать типы и члены как public для того, чтобы другие сборки имели к ним доступ. Только сборки, которые явным образом указаны как дружественные, могут обращаться к internal типам и членам. Указать дружеские сборки можно с помощью атрибута System.Runtime.CompilerServices.InternalsVisibleTo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | using System.Runtime.CompilerServices; using System; [assembly: InternalsVisibleTo("AssemblyB")] class FriendClass { public void Test() { Console.WriteLine("Sample Class"); } } public class ClassWithFriendMethod { internal void Test() { Console.WriteLine("Sample Method"); } } |
Ограничение доступа (Accessibility Capping)
Типы ограничивают доступ своих членов. Например:
1 | class C { public void Foo() {} } |
Класс С по умолчанию имеет доступ internal и он ограничивает доступ своего метода Foo, делая его тоже internal несмотря на то, что для Foo явно задан доступ public.

