Внутренние спецификаторы доступа C #,

Я создал одно приложение ConsoleApplication, чтобы понимать спецификаторы доступа.

Ниже мой код для внутреннего, я могу получить доступ к этому классу извне Assembly.

namespace Assembly_1 //This is first assembly.
{       
   public class Base
   {
       //internal class
       internal class B
       {
          public static void fnB()
          {
            Console.WriteLine("fnB");
          }
       }        
   }    
}

namespace Assembly_2 //This is second assembly.
{   
    public class Derived : Assembly_1.Base
    {            
        public class D
        {
            public void fnD()
            {
                B.fnB();//how can I access this class?
            }
        }
    }
}

И вот где я получаю к нему доступ.

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {                
            Assembly_2.Derived.D d = new Assembly_2.Derived.D();
            d.fnD();
        }
    }
}

Мой вопрос

Прямо сейчас я могу получить доступ к классу B и его методам, таким как fnB () в Derived.

Все нормально работает. но как?

Как я могу получить доступ к B-классу вне Assembly_1?


person Bharat    schedule 20.04.2017    source источник
comment
Прямо сейчас я могу получить доступ к классу B и его методам, таким как fnB () в Derived. Вы хотели сказать, что не можете получить к ним доступ?   -  person DavidG    schedule 20.04.2017
comment
Если вы хотите получить к нему доступ извне его сборки, зачем вы вообще отметили его внутренним?   -  person CodeCaster    schedule 20.04.2017
comment
Вы не можете использовать модификаторы точки доступа, сделайте их общедоступными, если вы хотите использовать их вне этого проекта.   -  person EpicKip    schedule 20.04.2017
comment
@DavidG: нет, я могу получить к нему доступ, но я не знаю почему?   -  person Bharat    schedule 20.04.2017
comment
Может быть, вы путаете термины пространства имен и сборки?   -  person Ofir Winegarten    schedule 20.04.2017
comment
Если это всего лишь две сборки, и вам нужно поделиться внутренними компонентами (по каким-либо причинам - я согласен с @EpicKip), просто используйте InternalsVisibleToAttribute на первой сборке. msdn.microsoft.com / ru-ru / library /   -  person Digvijay    schedule 20.04.2017
comment
@DavidG - я полностью согласен с моим комментарием. Но просто хотел представить, что есть способ, встроенный в каркас для такого сценария!   -  person Digvijay    schedule 20.04.2017
comment
сначала просмотрите вопрос, а затем ответьте, я могу получить доступ к B.fnB (). и я не знаю почему? и почему все его понижают, не понимая как следует?   -  person Bharat    schedule 20.04.2017
comment
@Bharat, как в моем комментарии, если вы можете получить к нему доступ, это означает, что оба пространства имен находятся в одной сборке. Создайте еще один проект библиотеки классов и поместите туда базовый класс. затем добавьте ссылку на него из проекта основной консоли   -  person Ofir Winegarten    schedule 20.04.2017
comment
Вы говорите, что создали одно консольное приложение. Как именно у вас в одном приложении две сборки? Когда я беру ваш код и помещаю его в две отдельные сборки, это вызывает ошибку времени компиляции (Base.B недоступен из-за уровня защиты), как и ожидалось.   -  person Luaan    schedule 20.04.2017
comment
@OfirWinegarten, Да, я сосредоточен на вашем комментарии и тестирую его в своем коде, но пока что я получил 2 перехода на более раннюю версию, эти люди не читают вопрос внимательно ..   -  person Bharat    schedule 20.04.2017
comment
@Bharat, не волнуйтесь, сосредоточьтесь на коде, а не на отрицательных голосах :)   -  person Ofir Winegarten    schedule 20.04.2017
comment
Да, это не дубликат вопроса, выбранного CodeCaster. Но это все еще плохой вопрос; отчасти из-за запутанного языка (например, CodeCaster отвечает на ваш вопрос Как я могу получить доступ ..., а не из-за вашего предполагаемого вопроса, который, похоже, Почему я могу доступ ...), отчасти потому, что проблема не может быть воспроизведена (скорее всего, из-за того, что вы не понимаете, что такое сборка).   -  person Luaan    schedule 20.04.2017
comment
@Luaan ждите обновлений, я запускаю его в своей системе, и он работает   -  person Bharat    schedule 20.04.2017
comment
@CodeCaster: удалите повторяющийся тег и прочтите вопрос еще раз.   -  person Bharat    schedule 20.04.2017
comment
@OfirWinegarten, друг мой, я нигде не ошибся, не могли бы вы проверить еще раз ..   -  person Bharat    schedule 20.04.2017
comment
Это редактирование ничего не помогло. Насколько актуально консольное приложение? Ожидаете ли вы, что internal член, к которому осуществляется доступ в public члене, должен превратить этот публичный член во внутренний? Почему? Как? Ожидаете ли вы также, что, пока есть открытый член, имеющий доступ к закрытому члену, это сделает другой класс неспособным использовать открытый член?   -  person Luaan    schedule 20.04.2017
comment
@Bharat, сколько проектов у вас в решении?   -  person Ofir Winegarten    schedule 20.04.2017
comment
@OfirWinegarten и #luaan, очень много, и это только для исследований и разработок, но здесь все настолько просто, что я могу запустить его и распечатать консоль B.fnB ()   -  person Bharat    schedule 20.04.2017
comment
Вы уверены, что namespace Assembly_1 действительно определен в другом проекте? Я совершенно уверен, что это не так. Он находится в том же проекте (сборке), что и namespace Assembly_2   -  person Ofir Winegarten    schedule 20.04.2017
comment
@Luaan теперь я также запутался из-за вашего комментария, станет ли внутренний член общедоступным, если я получу к нему доступ из общедоступного метода? Совсем не знаю, поэтому и спросил ..   -  person Bharat    schedule 20.04.2017
comment
@OfirWinegarten, вы правы, он находится в одном проекте с другим пространством имен ..   -  person Bharat    schedule 20.04.2017
comment
Вы никогда не обращаетесь к B.fnB в консольном проекте, только к D.fnD. D.fnD является общедоступным, и не имеет значения, что он вызывает внутри. Было бы совершенно бесполезно, если бы это было так.   -  person Luaan    schedule 20.04.2017
comment
Итак, @Bharat прочитал, в чем разница между сборкой и пространством имен в Google.   -  person Ofir Winegarten    schedule 20.04.2017
comment
@Luaan, хорошо, но из-за уровня защиты я не должен обращаться к B.fnB () из функции fnD (), я прав?   -  person Bharat    schedule 20.04.2017
comment
@OfirWinegarten Я думаю, что вы правы, мне нужно проверить сборку и пространство имен, наконец-то я получил свой ответ ... все просто спешат получить награды ... вы можете добавить это в качестве ответа ... может быть, это поможет другим пользователям нравлюсь я ..   -  person Bharat    schedule 20.04.2017
comment
все спешат получить награды - нет, этот сайт задуман как набор четких, уникальных вопросов, которые будут полезны другим, а не только тому, кто задает. Неясные вопросы следует закрывать до тех пор, пока они не будут прояснены.   -  person CodeCaster    schedule 20.04.2017
comment
@CodeCaster мой друг, изначально вы вообще не читали вопрос, а просто сделали его дубликатом ??   -  person Bharat    schedule 20.04.2017
comment
Может быть, вы путаете термины пространства имен и сборки? был комментарий Офира всего через несколько минут после того, как вы задали свой вопрос. Во время этого разговора это повторялось несколько раз.   -  person Luaan    schedule 20.04.2017
comment
Я могу заверить вас, что прочитал первоначальный вопрос, но его формулировка, наряду с первым комментарием Дэвида, заставила меня поверить в то, что вы спрашивали, как можно заставить этот код работать.   -  person CodeCaster    schedule 20.04.2017


Ответы (2)


Как я сказал в комментариях:

Вы путаете термины namespace и assembly. Вы можете прочитать об этом здесь :( Сборки и пространство имен)

Многие пространства имен могут быть определены в одном assembly.

Если вы хотите проверить и понять модификатор internal, вам нужно будет создать новый проект библиотеки классов (который будет компилироваться в другую сборку), определить там класс Base и добавить ссылку на него в вашем основном консольном приложении. Тогда вы увидите, что у вас больше нет к нему доступа, и код не будет компилироваться.

person Ofir Winegarten    schedule 20.04.2017

Как я могу получить доступ к классу B вне Assembly_1?

Потому что вы путаете пространства имен и сборки. Сборка - это набор из одного или нескольких пространств имен, содержащихся в файле .dll или .exe.

См. Также: MSDN: сборки в среде CLR и Понимание и использование сборок и пространств имен в .NET .

То, что вы называете Assembly_1 и Assembly_2, - это пространства имен внутри одной сборки.

Поскольку internal члена видны в одной сборке, вы можете использовать Assembly_1.B из Assembly_2.D, потому что оба пространства имен находятся в одной сборке.

person Community    schedule 20.04.2017
comment
извините @CodeCaster, но Офир поддерживает меня во всех обсуждениях, так что он должен получить дополнительные баллы, спасибо вам тоже .. - person Bharat; 20.04.2017
comment
@Bharat Мне действительно наплевать на очки репутации, поэтому я разместил это как вики сообщества. - person CodeCaster; 20.04.2017