Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp Language Specification.doc
Скачиваний:
13
Добавлен:
26.09.2019
Размер:
4.75 Mб
Скачать

3.5.1Объявленная доступность

Возможные варианты объявленной доступности члена представлены ниже.

  • Общая, выбираемая путем включения модификатора public в объявление члена. Интуитивное понимание модификатора public — «доступ не ограничен».

  • Защищенная, выбираемая путем включения модификатора protected в объявление члена. Интуитивное понимание модификатора protected — «доступ ограничен до класс-контейнера или типов, производных от класс-контейнера».

  • Внутренняя, выбираемая путем включения модификатора internal в объявление члена. Интуитивное понимание модификатора internal — «доступ ограничен до данной программы».

  • Внутренняя защищенная (обозначает защищенную или внутреннюю доступность), выбираемая путем включения модификаторов protected и internal в объявление члена. Интуитивное понимание модификатор protected internal — «доступ ограничен до данной программы или типов, производных от класс-контейнера».

  • Частная, выбираемая путем включения модификатора private в объявление члена. Интуитивное понимание модификатора private — «доступ ограничен до тип-контейнера».

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

  • Пространства имен неявно имеют объявленную доступность public. Модификаторы доступа запрещены для объявлений пространств имен.

  • Типы, объявленные в блоках компиляции, или пространства имен могут иметь объявленную доступность public или internal, а по умолчанию используется объявленная доступность internal.

  • Члены класса могут иметь любую из пяти типов объявленной доступности, а по умолчанию используется объявленная доступность private. (Обратите внимание, что тип, объявленный в качестве члена класса, может иметь любую из пяти объявленных доступностей, тогда как тип, объявленный в качестве члена пространства имен, может иметь только объявленную доступность public или internal.)

  • Члены структуры могут иметь объявленную доступность public, internal или private, а по умолчанию использует объявленная доступность private, так как структуры неявно запечатаны. Члены структуры, размещенные в структуре (т. е. не унаследованные данной структурой), не могут иметь статусы объявленной доступности protected или protected internal. (Обратите внимание, что тип, объявленный в качестве члена структуры, может иметь объявленную доступностей public, internal или private, тогда как тип, объявленный в качестве члена пространства имен, может иметь только объявленную доступность public или internal.)

  • Члены интерфейса неявно имеют объявленную доступность public. Модификаторы доступа запрещены для объявлений члена интерфейса.

  • Члены перечисления неявно имеют объявленную доступность public. Модификаторы доступа запрещены для объявлений члена перечисления.

3.5.2Домены доступности

Домен доступности члена состоит из (возможно, не связанных) разделов текста программы, в которых разрешен доступ к члену. С целью определения домена доступности члена он считается верхнего уровня, если он не объявлен в рамках типа, и считается вложенным, если он объявлен в рамках другого типа. Дополнительно определяется текст программы программы как весь текст программы, содержащийся во всех исходных файлах программы, а текст программы типа определяется как весь текст программы, содержащийся в объявлениях_типа данного типа (включая, возможно, типы, вложенные в этот тип).

Домен доступности предопределенного типа (например, object, int или double) неограничен.

Домен доступности свободного типа верхнего уровня T (§4.4.3), объявленного в программе P, определяется следующим образом.

  • Если для T объявлена доступность public, доменом доступности T является текст программы P и любая программа, ссылающаяся на P.

  • Если для T объявлена доступность internal, доменом доступности T является текст программы P.

Из этих определений следует, что домен доступности свободного типа верхнего уровня всегда является по крайней мере текстом программы, в которой данный тип объявлен.

Доменом доступности для сформированного типа T<A1, ...,AN> является пересечение домена доступности обобщенного свободного типа T и доменов доступности аргументов типа A1, ...,AN.

Домен доступности вложенного члена M, объявленного в типе T в программе P, определяется следующим образом (учитывая, что M может являться типом).

  • Если для M объявлена доступность public, домен доступности M совпадает с доменом доступности T.

  • Если для M объявлена доступность protected internal, пусть D будет объединением текста программы P и текста программы любого типа, произведенного из T, объявленного вне P. Доменом доступности M является пересечение домена доступности T с доменом доступности D.

  • Если для M объявлена доступность protected, пусть D будет объединением текста программы T и текста программы любого типа, произведенного из T. Доменом доступности M является пересечение домена доступности T с доменом доступности D.

  • Если для M объявлена доступность internal, доменом доступности M является пересечение домена доступности T с текстом программы P.

  • Если для M объявлена доступность private, домен доступности M совпадает с текстом программы T.

Из этих определений следует, что домен доступности вложенного члена всегда является по крайней мере текстом программы, в которой член объявлен. Дополнительно следует, что домен доступности члена никогда не включает больше объектов, чем домен доступности типа, в котором он объявлен.

Интуитивно это значит, что при доступе к типу или члену M для обеспечения разрешения доступа вычисляются следующие шаги.

  • Сначала, если M объявлен в типе (в противоположность блоку компиляции или пространству имен), при недоступности данного типа возникает ошибка времени компиляции.

  • Затем, если M объявлен как public, доступ разрешается.

  • В противном случае, если M объявлен как protected internal, доступ разрешается в том случае, когда он происходит в рамках программы, в которой объявлен M, или когда он происходит в рамках класса, произведенного из класса, в котором объявлен M, и доступ выполняется посредством производного типа класса (§3.5.3).

  • В противном случае, если M объявлен как protected, доступ разрешается в том случае, когда он происходит в рамках класса, в котором объявлен M, или когда он возникает в рамках класса, произведенного из класса, в котором объявлен M, и доступ выполняется посредством производного типа класса (§3.5.3).

  • В противном случае, если M объявлен как internal, доступ разрешается, если он происходит в рамках программы, в которой объявлен M.

  • В противном случае, если M объявлен как private, доступ разрешается, если он происходит в рамках типа, в котором объявлен M.

  • В противном случае тип или член недоступны, и возникает ошибка времени компиляции.

Пример:

public class A { public static int X; internal static int Y; private static int Z; }

internal class B { public static int X; internal static int Y; private static int Z;

public class C { public static int X; internal static int Y; private static int Z; }

private class D { public static int X; internal static int Y; private static int Z; } }

классы и члены имеют следующие области доступности.

  • Домен доступности A и A.X неограничен.

  • Доменом доступности A.Y, B, B.X, B.Y, B.C, B.C.X и B.C.Y является текст программы содержащей программы.

  • Доменом доступности A.Z является текст программы A.

  • Доменом доступности B.Z и B.D является текст программы B, включая текст программы B.C и B.D.

  • Доменом доступности B.C.Z является текст программы B.C.

  • Доменом доступности B.D.X и B.D.Y является текст программы B, включая текст программы B.C и B.D.

  • Доменом доступности B.D.Z является текст программы B.D.

Как видно из примера, область доступности члена никогда не превышает области доступности содержащего типа. Например, несмотря на то, что все члены X имеют открытую объявленную доступность, все члены кроме A.X имеют домены доступности, ограниченные тип-контейнером.

Согласно описанию в разделе §3.4 все члены базового класса, кроме конструкторов экземпляров, деструкторов и статических конструкторов, наследуются производными типами. Это касается даже закрытых членов базового класса. Однако домен доступности закрытого класса включает только текст программы типа, в котором член объявлен. Пример:

class A { int x;

static void F(B b) { b.x = 1; // Ok } }

class B: A { static void F(B b) { b.x = 1; // Error, x not accessible } }

класс B наследует закрытый член x из класса A. Так как член является закрытым, он доступен только в рамках тела_класса A. Поэтому доступ к b.x успешно осуществляется в методе A.F, но невозможен в методе B.F.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]