C#内部类



在《Java编程思想》中花了一章的篇幅介绍,内部类的相关特性。而在C#的书籍中很少有提交内部类的介绍。这篇文章,就简要介绍一下,C#中的内部类。



我们新建一个测试类文件,定义一个类:OuterClass。在其内部定义一个类:InnerClass1(暂且将其访问级别设置为public)。

来做几个简单测试,截图如下:



以上在InnerClass1中试图访问outerClass的实例变量失败!



内部类访问外部类的实例方法同样失败!



外部类也无法索引到内部类的实例变量(同样外部类也无法调用内部类的任何实例方法,即使方法是公有方法)。

这在预料之中:不管innerClass1定义在外部还是在OutClass内部,一个类的非静态方法和变量都只属于该类的对象。所以在一个类的外部,必须要通过类的实例来访问它的非静态成员。



可以看到内部类和外部类都可以顺利得访问各自的静态成员,这是因为静态成员是属于类本身的,只要能够访问类,就可以访问类的静态成员。上图中,由于是在内部类的外部引用内部类的静态成员,已经出了内部类的定义,所以需要内部类的类名来索引。而内部类访问外部类的静态成员时,由于内部类的定义在外部类中,并未出外部类,所以可以直接引用。



上图仅仅更改了一下,各个成员的访问级别。就出现了不同的结果。上图说明,外部类所有访问级别的静态成员对内部类始终可见。而内部类中静态成员的可见性,与普通类一样,受其定义时的访问级别控制。需要注意的是,其可见性与内部类【innerClass1】的访问级别无关。这是因为,从大的层面上来讲,innerClass1仍然是outerClass的成员之一,给它定义的访问级别是针对outerClass外部的,所以innerClass本身对outclass是一直可见的,而innerClass的内部成员却并不是都对outClass可见,因为outClass相对这些成员来说已经是innerClass的"外部"了。

如果将innerClass定义为public,那么它和普通的类并没有太大的区别,只是在创建它的时候需要“套”上外部类的名称罢了。这也是为什么可以将内部类视为外部类的成员的原因。示例如下:



其中,test()为内部类的公有实例方法。

但是,如果将内部类的访问级别修改为private,就无法在外部索引它了。这不同于普通类(因为普通类不可以被定义为私有的)。但是还是有办法获得它的实例,我们可以在外部类中公有方法中,创建一个内部类的实例,并返回其引用:





虽然无法将实例对象的引用赋予一个该类型的变量(因为已经无法获得内部类的类型了),但是这并不影响去调用它的实例方法。因为outerClass的实例方法:GetInnerClassInstance()拿到了innerclass1对象的引用。

控制这种“非法”访问的机制可以有几种:将内部类的构造器设为私有、或者严格设置内部类成员的访问级别。

这里只是粗略地讲解一下,C#中普通内部类的成员访问机制。这当然不是内部类的存在的意义。下面会继续探讨C#内部类的其他用处。



版权声明:本文为博主原创文章,未经博主允许不得转载。