与Java不同,C#中的类是嵌套的。包含类的实例与所包含类的实例之间没有关系。在C#中仅仅使用包含类来控制所包含类的可访问性,避免污染命名空间。(一些公司有一个编码规范,每个类必须放在它自己的文件中,对于小型类而言,嵌套类是绕过这个规定的一种方式。)在Java中,内部类的实例(对象)具有指向外部类的指针。这是Java中常用小类处理事件等的一种方法。而在C#中,可以使用委托来实现。(嵌套类曾是Java中的一种实验理念,每个人都喜欢,但其并不能真正经受住时间的考验。由于C#出现得晚,它能够从Java中学习那些行不通的东西。)
C#中,常规类和内部类之间至少存在三个不同之处,内部类还可以形成内外类之间的关系。 内部类可以声明为protected、internal、protected internal或private,而普通类则不能。 内部类可以访问包含它的外部类的静态成员,而无需使用该类的名称。 当内部类访问外部类的实例时,即使这些成员不是静态的,它也可以访问该对象的私有成员。