Модификатор доступа к внутреннему классу не работает?

Я действительно не понимаю почему, но похоже, что модификатор внутреннего доступа не работает: S

Я просмотрел этот учебник: http://msdn.microsoft.com/en-us/library/7c5ka91b(v=vs.110).aspx

Но для меня он компилируется. ТАКЖЕ, я купил книгу Illustrated C # 2012. И автор объясняет внутренний класс и т.д.

Вот мой полный код, который работает ДАЖЕ с внутренним доступом.

//Program.cs
namespace ConsoleApplication1
{
    class Program
    {
       static void Main(string[] args)
       {
           Class1 myclass = new Class1(); //works
           myclass.display(); //works
           myclass.display2(); //works even though its not public :S
           Console.Read();
       }
    }
}

-

//Class1.cs
namespace ConsoleApplication1
{
    internal class Class1
    {
       public void display()
       {
           Console.WriteLine("display()");
       }

       internal void display2()
       {
           Console.WriteLine("display2()");
       }
    }
}

Я даже могу получить доступ к функции internal void display2 (): S


person Assassinbeast    schedule 23.03.2013    source источник
comment
Может ты путаешь internal и private?   -  person Chris Sinclair    schedule 23.03.2013


Ответы (4)


internal означает «Доступен для чего угодно в той же сборке».

Поскольку ваш класс Class1 и класс Program находятся в одной сборке, класс Program может обращаться к display2 ().

Я думаю, вы случайно поместили их в одну сборку; если вы внимательно посмотрите на образец кода Microsoft, вы увидите, что он говорит "Assembly1.cs" и "Assembly2.cs"

Если вы используете Visual Studio, самый простой способ проверить это с другой сборкой - создать новый проект библиотеки классов в том же решении. Это будет считаться отдельной сборкой. Вам нужно будет добавить в основной проект ссылку на новый проект (через «Добавить ссылку», а затем на вкладку «Решение»).

Если вам нужна дополнительная информация, есть вопрос о переполнении стека на тему «Что такое сборка?».

person Matthew Watson    schedule 23.03.2013
comment
wOOt? Думал сборка вроде разные cs. файлы - person Assassinbeast; 23.03.2013
comment
Это как совершенно отдельная DLL. Посмотрев эту документацию Microsoft, они действительно не очень хорошо ее объясняют! - person Matthew Watson; 23.03.2013

Если оба класса находятся в одной сборке, internal работает должным образом.

Модификатор internal используется, чтобы гарантировать, что типы и члены доступны только для файлов в одной сборке.

Ссылка: http://msdn.microsoft.com/en-gb/library/7c5ka91b%28v=vs.80%29.aspx

person Martin    schedule 23.03.2013
comment
ааа, так как вы собираетесь получить доступ к файлу .cs, если он не находится в том же проекте? - person Assassinbeast; 23.03.2013
comment
Вы можете добавить несколько проектов в одно решение в VS, а внутренние типы и члены в одном проекте недоступны для других проектов, но общедоступные доступны. - person Martin; 23.03.2013

Из MSDN;

Внутренние типы или члены доступны только в файлах в одной сборке.

Поскольку Program и Class1 в одной сборке, проблем быть не должно ..

Что именно делает внутренний модификатор? В нем говорится, что «интуитивно понятное значение слова internal -« доступ ограничен этой программой »».

Другими словами, никакая внешняя программа не сможет получить доступ к внутреннему типу.

person Soner Gönül    schedule 23.03.2013

Модификатор доступа internal означает, что к члену можно получить доступ где угодно из одной и той же сборки. В вашем случае классы «Program» и «Class1» находятся в одной сборке, поэтому Program может получить доступ к display2 (который также internal и находится в одной сборке).

Если вы не хотите, чтобы к display2 был доступ из класса Program, вы можете просто сделать его private, и поэтому он будет доступен только из Class1.

person Trivaxy    schedule 23.01.2017
comment
Об этом уже есть несколько других ответов. Нам не нужен другой ответ, говорящий то же самое. - person Servy; 24.01.2017