嵌套的类型定义

  除了在名称空间中定义类型(如类)之外,还可以在其他类中定义它们。如果这么做,就可以在定义中使用各种访问修饰符,而不仅仅是 publicinternal,也可以使用 new 关键字来隐藏继承于基类的类型定义。例如,以下代码定义了 MyClass,也定义了一个嵌套的类 myNestedClass

  1. public class MyClass
  2. {
  3. public class MyNestedClass
  4. {
  5. public int NestedClassField;
  6. }
  7. }

  如果要在 MyClass 的外部实例化 myNestedClass,就必须限定名称,例如:

  1. MyClass.MyNestedClass myObj = new MyClass.MyNestedClass();

  但是,如果嵌套的类声明为私有,就不能这么做。这个功能主要用来定义对于其包含类来说是私有的类,这样,名称空间中的其他代码就不能访问它。使用该功能的另一个原因是嵌套类可以访问其包含类的私有和受保护成员。接下来的示例演示了嵌套类。

  修改 Program.cs 中的代码,如下所示:
  1. namespace Ch10Ex02
  2. {
  3. public class ClassA
  4. {
  5. private int state = -1;
  6. public int State
  7. {
  8. get
  9. {
  10. return state;
  11. }
  12. }
  13. public class ClassB
  14. {
  15. public void SetPrivateState(ClassA target, int newState)
  16. {
  17. target.state = newState;
  18. }
  19. }
  20. class Program
  21. {
  22. static void Main(string[] args)
  23. {
  24. ClassA myObject = new ClassA();
  25. Console.WriteLine("myObject.State = {0}", myObject.State);
  26. ClassA.ClassB myOtherObject = new ClassA.ClassB();
  27. myOtherObject.SetPrivateState(myObject, 999);
  28. Console.WriteLine("myObject.Sate = {0}", myObject.State);
  29. Console.ReadKey();
  30. }
  31. }
  32. }
  33. }
  示例的说明

  Main()中的代码创建并使用了 ClassA 的一个实例,该类包含一个只读属性 State。然后创建了嵌套类 ClassA.ClassB 的一个实例。该嵌套类能够访问 ClassA.State 的底层字段 ClassA.state,即使这个字段是一个私有字段。因此,嵌套类的方法 SetPrivateState() 可以修改 ClassA 的只读属性 State 的值。

  由必要再次重申一下,之所以可以这么做,是因为 ClassB 被定义为 ClassA 的嵌套类。如果把 ClassB 的定义移出 ClassA,那么上面的代码就会产生如下编译错误:

  1. `Ch10Ex02.ClassA.state` is inaccessible due to its protection level.

  将类的内部状态提供给嵌套类这一功能在某些情况下十分有用。但是,大多数时候通过类提供的方法操作其内部状态就足够了。