Доступ к членам типа и область видимости
При определении члена типа (в том числе вложенного) можно указать модификатор доступа к члену. Модификаторы определяют, на какие члены можно ссылаться из кода. В CLR имеется собственный набор возможных модификаторов доступа, но в каждом языке программирования существуют свои синтаксис и термины. Например, термин Assembly в CLR указывает, что член доступен изнутри сборки, тогда как в C# для этого используется ключевое слово internal.
CLR | C# | Описание |
---|---|---|
Private | private | Доступен только методам в определяющем типе и вложенных в него типах |
Public | public | Доступен всем методам во всех сборках |
Assembly | internal | Доступен только методам в определяющей сборке |
Assembly or Family | internal protected | Доступен только методам вложенного типа, производного типа (независимо от сборки) и любым методам определяющей сборки |
Family | protected | Доступен только методам в определяющем типе или в одном из его производных типа независимо от сборки |
? | private protected | Доступен только методам вложенного типа, производного типа и любым методам определяющей сборки в рамках одной сборки |
Дружественные сборки
Представил ситуацию, когда одна компания написала сборку А и хочет предоставить доступ к ее типам другой сборке. Для этого нужно сделать ее открытой, но тогда она будет открыта для всех.Чтобы предоставить функционал одной сборки А какой-то другой сборке В, используется механизм дружественных сборок.
В процессе создания сборки можно указать другие сборки, которые она будет считать «друзьями», — для этого служит атрибут InternalsVisibleTo, определенный в пространстве имен System.Runtime.CompilerServices. У атрибута есть строковый параметр, определяющий имя дружественной сборки и ее открытый ключ (передаваемая атрибуту строка не должна содержать информацию о версии, региональных стандартах или архитектуре процессора). Заметьте, что дружественные сборки получают доступ ко всем внутренним типам сборки, а также к внутренним членам этих типов. Приведем пример сборки, которая объявляет дружественными две другие сборки со строгими именами Wintellect и Microsoft:
using System; using System.Runtime.CompilerServices; // Для атрибута InternalsVisibleTo
// Внутренние типы этой сборки доступны из кода двух следующих сборок
// (независимо от версии или региональных стандартов)
[assembly:InternalsVisibleTo("Wintellect, PublicKey=12345678...90abcdef")]
[assembly:InternalsVisibleTo("Microsoft, PublicKey=b77a5c56...1934e089")]
internal sealed class SomeInternalType { ... }
internal sealed class AnotherInternalType { ... }