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