Есть ли какое-либо ограничение для указания спецификатора доступа членов класса, когда мы указали спецификатор доступа к классу? - PullRequest
1 голос
/ 24 августа 2009

Предположим, что у нас есть класс с именем class1.

У class1 есть несколько свойств и методов, и мы решили указать спецификатор доступа для class1 как внутренний.

Теперь, мы можем установить спецификатор доступа методов class1 как public?

Ответы [ 3 ]

7 голосов
/ 24 августа 2009

Для вашего конкретного вопроса класс 1, объявленный как внутренний, может иметь открытый метод.

Почему?

Посмотрите на Объяснение Джона Скитса :

Вы, конечно, можете пометить класс как внутренний, но это отличается от сделав своих публичных членов внутренними. Например, предположим, у вас есть класс который реализует публичный интерфейс. Хотя класс может быть внутренним, экземпляр все еще может «выйти из сборка "будучи возвращенным из член другого (публичного) класса. Тот экземпляр должен быть ссылаться интерфейсом он реализует скорее чем само имя класса (как класс не известен извне сборка) но публичные методы могут все еще будет называться.

Если публичные методы не реализуя любые интерфейсы, я подозреваю это будет иметь значение только в очень мало случаев отражения, которые вы может не заботиться.

Сообщество вики - как заслуга Джона Скита

1 голос
/ 24 августа 2009

Да, вы можете установить public для членов типов internal / private / etc.

Как отмечалось в других ответах, внешний код не сможет видеть свойства, пока не увидит тип - но есть много нюансов:

  • если член находится на интерфейсе, он будет (по существу) частью общедоступного API
  • член может быть публичным переопределением виртуального / абстрактного члена - в этом случае будет действительно видимым для всех, но через базовый класс (опять же, аналогично интерфейсам)

Но в платформе много другого кода, который использует отражение и требует публичной доступности:

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

Так что есть еще много причин подумать о public, а не просто internal, даже если на ваш код ссылается только локальная сборка.

1 голос
/ 24 августа 2009

По правилу спецификаторы доступа к методам и свойствам не могут быть более доступными, чем у класса, его содержащего.

Но я пробовал это:

internal class Test
{
    public string Testing{get;set;}
}

и компилируется без каких-либо исключений! Я думаю, все в порядке , поскольку класс Test не будет доступен за пределами пространства имен сборки , которое мы объявили, поэтому публичное свойство не будет иметь значения

Это не работает:

private class Test
{
    public string Testing{get;set;}
    internal string TestingAgain{get;set;}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...