2013-03-23 3 views
1

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

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

Но для меня, он компилирует. Кроме того, у меня есть книга, иллюстрированная C# 2012. И автор объясняет внутренний класс и т. Д. И т. Д. Но, тем не менее, он ничего не делает.

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

//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()"); 
     } 
    } 
} 

Я могу даже получить доступ к функции внутренних пустот DISPLAY2(): S

+0

Возможно, вы сбиваете с толку 'internal' и' private'? –

ответ

7

internal означает "Acessible ничем в той же сборке".

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

Думаю, вы случайно поставили их в одну и ту же сборку; если вы внимательно посмотрите на примерный код Microsoft, вы увидите, что он говорит «Assembly1.cs» и «Assembly2.cs»

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

Если вам нужна дополнительная информация, пожалуйста, a Stack Overflow question about "What's an assembly?".

+0

wOOt? Я думал, что сборка похожа на разные cs. файлы – Assassinbeast

+1

Это как полностью отдельная DLL. Посмотрев на эту документацию Microsoft, они действительно не очень хорошо ее объясняют! –

+0

ОК, спасибо :-) – Assassinbeast

2

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

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

Ref: http://msdn.microsoft.com/en-gb/library/7c5ka91b%28v=vs.80%29.aspx

+0

ahh, так как же вы получите доступ к файлу .cs, если его не в том же проекте? – Assassinbeast

+0

Вы можете добавить несколько проектов в одно решение в VS, а внутренние типы и члены в одном проекте недоступны для других проектов, но общедоступны. –

+0

ahh ok, я не знал, что ... спасибо !! :-) – Assassinbeast

1

От MSDN;

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

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

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

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

-1

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

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

+1

Уже есть несколько других ответов, говорящих об этом. Нам не нужен * другой * ответ, говорящий то же самое. – Servy

Смежные вопросы