嵌套的类型定义
除了在名称空间中定义类型(如类)之外,还可以在其他类中定义它们。如果这么做,就可以在定义中使用各种访问修饰符,而不仅仅是 public
和 internal
,也可以使用 new
关键字来隐藏继承于基类的类型定义。例如,以下代码定义了 MyClass
,也定义了一个嵌套的类 myNestedClass
:
public class MyClass
{
public class MyNestedClass
{
public int NestedClassField;
}
}
如果要在 MyClass
的外部实例化 myNestedClass
,就必须限定名称,例如:
MyClass.MyNestedClass myObj = new MyClass.MyNestedClass();
但是,如果嵌套的类声明为私有,就不能这么做。这个功能主要用来定义对于其包含类来说是私有的类,这样,名称空间中的其他代码就不能访问它。使用该功能的另一个原因是嵌套类可以访问其包含类的私有和受保护成员。接下来的示例演示了嵌套类。
修改 Program.cs 中的代码,如下所示:
namespace Ch10Ex02
{
public class ClassA
{
private int state = -1;
public int State
{
get
{
return state;
}
}
public class ClassB
{
public void SetPrivateState(ClassA target, int newState)
{
target.state = newState;
}
}
class Program
{
static void Main(string[] args)
{
ClassA myObject = new ClassA();
Console.WriteLine("myObject.State = {0}", myObject.State);
ClassA.ClassB myOtherObject = new ClassA.ClassB();
myOtherObject.SetPrivateState(myObject, 999);
Console.WriteLine("myObject.Sate = {0}", myObject.State);
Console.ReadKey();
}
}
}
}
示例的说明
Main()
中的代码创建并使用了 ClassA
的一个实例,该类包含一个只读属性 State
。然后创建了嵌套类 ClassA.ClassB
的一个实例。该嵌套类能够访问 ClassA.State
的底层字段 ClassA.state
,即使这个字段是一个私有字段。因此,嵌套类的方法 SetPrivateState()
可以修改 ClassA
的只读属性 State
的值。
由必要再次重申一下,之所以可以这么做,是因为 ClassB
被定义为 ClassA
的嵌套类。如果把 ClassB
的定义移出 ClassA
,那么上面的代码就会产生如下编译错误:
`Ch10Ex02.ClassA.state` is inaccessible due to its protection level.
将类的内部状态提供给嵌套类这一功能在某些情况下十分有用。但是,大多数时候通过类提供的方法操作其内部状态就足够了。