2013-03-23 48 views
1

我真的不明白爲什麼,但它似乎是內部訪問修飾符不起作用: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()"); 
     } 
    } 
} 

我甚至可以訪問功能內部空隙顯示2()表示:S

+0

也許你在混淆'internal'和'private'? – 2013-03-23 11:29:40

回答

7

internal是指 「在相同的組件的任何Acessible」。

因爲您的班級Class1和班級程序在同一個程序集中,班級Program可以訪問display2()。

我想你已經不小心把它們放在同一個程序集中;如果仔細觀察微軟的示例代碼,您會看到它顯示「Assembly1.cs」和「Assembly2.cs」

如果您使用的是Visual Studio,則使用不同的程序集測試此最簡單的方法是創建一個新的類庫項目在同一個解決方案中。然後,這將被視爲一個單獨的程序集。您必須向主項目添加對新項目的引用(通過「添加引用」和「解決方案」選項卡)。

如果您需要更多信息,有a Stack Overflow question about "What's an assembly?"

+0

有沒有?我以爲組裝就像不同的CS。文件 – Assassinbeast 2013-03-23 11:34:10

+1

這就像一個完全獨立的DLL。看過微軟的文檔,他們真的沒有很好地解釋它! – 2013-03-23 11:34:49

+0

好的,謝謝:-) – Assassinbeast 2013-03-23 11:44:45

2

如果兩個類都在同一個程序集中,那麼internal按預期工作。

internal修飾符用於確保類型和成員僅可用於相同程序集中的文件。

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

+0

ahh,那麼如果它不在同一個項目中,你將如何訪問.cs文件? – Assassinbeast 2013-03-23 11:35:50

+0

您可以將多個項目添加到VS中的單個解決方案中,並且一個項目中的內部類型和成員不可用於其他項目,但公共項目是。 – 2013-03-23 11:37:18

+0

啊好吧,我不知道...謝謝! :-) – Assassinbeast 2013-03-23 11:45:22

1

MSDN;

內部類型或成員只能範圍內的同一 彙編文件

由於Program並在同一程序Class1,應該不會有問題訪問..

內部修飾符到底做了什麼?它指出「的內部的 直觀含義是「訪問限於此程序。」

換句話說,沒有外部程序將能夠訪問 內部類型。

-1

internal訪問修飾符意味着成員可以在同一個程序集中的任何位置訪問。 在你的情況下,類「程序」和「Class1」是在同一個程序集中,因此,程序可以訪問display2(同樣是程序集internal)。

如果您不希望從Program類訪問display2,您可以簡單地將其設置爲private,因此它只能從Class1訪問。

+1

已經有幾個其他答案說這個。我們不需要*另一個*回答說同樣的事情。 – Servy 2017-01-23 21:15:26