内部类访问修饰符不起作用?

时间:2013-03-23 11:26:37

标签: c# class internal

我真的不明白为什么,但似乎内部访问修饰符不起作用:S

我看过这个教程: http://msdn.microsoft.com/en-us/library/7c5ka91b(v=vs.110).aspx

但对我而言,它会编译。 另外,我买了一本图书画报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

4 个答案:

答案 0 :(得分:7)

internal表示“同一集会中的任何东西都可以访问”。

因为您的类Class1和类Program在同一个程序集中,所以类Program可以访问display2()。

我认为你不小心将它们放在同一个组件中;如果你仔细看看微软的示例代码,你会看到它说“Assembly1.cs”和“Assembly2.cs”

如果您使用的是Visual Studio,使用不同程序集测试此方法的最简单方法是在同一解决方案中创建新的类库项目。那将被视为一个单独的集会。您必须向主项目添加对新项目的引用(通过“添加引用”,然后是“解决方案”选项卡)。

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

答案 1 :(得分:2)

如果两个类都在同一个程序集中,那么internal正在按预期工作。

internal修饰符用于确保类型和成员仅可用于同一程序集中的文件。

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

答案 2 :(得分:1)

来自 MSDN ;

  

内部类型或成员只能在同一个文件中访问   装配

自同一程序集中的ProgramClass1以来,应该没有问题。

  

内部修饰符究竟做了什么?它声明“The   内部的直观含义是“访问仅限于此程序。”

     

换句话说,没有外部程序可以访问   内部类型。

答案 3 :(得分:-1)

internal访问修饰符表示可以在同一个程序集中的任何位置访问该成员。 在您的情况下,“Program”和“Class1”类在同一个程序集中,因此,Program可以访问display2(也是internal并在同一个程序集中)。

如果您不希望从Program类访问display2,则只需将其设为private,因此只能从Class1访问它。