С помощью модификаторов доступа можно ограничить доступ к типу или отдельному его члену из других типов и сборок. Модификатор добавляется к объявлению типа или его члена.
Всего доступно пять модификаторов доступа:
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
.