Доступ к членам типа и область видимости

При определении члена типа (в том числе вложенного) можно указать модификатор доступа к члену. Модификаторы определяют, на какие члены можно ссылаться из кода. В 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 { ... }

results matching ""

    No results matching ""