目录
一、什么是嵌套类型
在类或结构中声明类型(不是在命名空间中声明类型),嵌套类型可以是任意类型。
如果一个类只是作为帮助方法并且只对封闭类型有意义,可能就需要声明为嵌套类型了。(嵌套指类型声明的位置而不是内存中对象的位置)
二、嵌套类的示例
class MyClass //封闭类
{
class MyCounter //嵌套类:计数器
{
public int Count { get; private set; }
public static MyCounter operator ++(MyCounter current)
{
current.Count++;
return current;
}
}
MyCounter counter;
public MyClass()
{
counter = new MyCounter();
}
public int Incr() { return (counter++).Count; }//增量方法
public int GetValue() { return counter.Count; }//获取计数值
}
internal class Program
{
static void Main(string[] args)
{
MyClass mc = new MyClass();
mc.Incr();
mc.Incr();
mc.Incr();
mc.Incr();
mc.Incr();
mc.Incr();
Console.WriteLine("Total:{0}",mc.GetValue());
}
}
三、可见性和嵌套类型
1.嵌套类型的访问修饰符
类或类型的访问修饰符通常为public和internal,但是嵌套类型的可访问性类似于成员,嵌套类型拥有成员访问级别,而不是类型访问级别。
- 类内部的嵌套类型访问修饰符:public、protected、internal、protected internal、private
- 结构内部的嵌套类型访问修饰符:public、internal、private
- 嵌套类型的默认访问级别是private
2. 嵌套类型和封闭类型之间的访问关系
嵌套类型和封闭类型之间的访问关系是不对称的。
- 嵌套类型的成员对封闭类型的成员总是有完全访问权限。
- 封闭类型的成员:
- 总是可以访问嵌套类型本身
- 只能访问声明了有访问权限的嵌套类型成员
class SomeClass //封闭类
{
int Field1 = 15;
int Field2 = 20;
MyNested mn;
public SomeClass()
{
mn = new MyNested(this);
}
public void PrintMyMembers()
{ class SomeClass //封闭类
{
int Field1 = 15;
int Field2 = 20;
MyNested mn;
public SomeClass()
{
mn = new MyNested(this);
}
public void PrintMyMembers()
{
mn.PrintOutMembers();
}
public class MyNested
{
SomeClass sc;
public MyNested(SomeClass SC)
{
sc = SC;
}
public void PrintOutMembers()
{
Console.WriteLine("Field1 : {0}",sc.Field1);
Console.WriteLine("Field2 : {0}",sc.Field2);
}
}
}
internal class class1
{
static void Main(string[] args)
{
SomeClass sc = new SomeClass();
sc.PrintMyMembers();
}
}
mn.PrintOutMembers();
}
public class MyNested
{
SomeClass sc;
public MyNested(SomeClass SC)
{
sc = SC;
}
public void PrintOutMembers()
{
Console.WriteLine("Field1 : {0}",sc.Field1);
Console.WriteLine("Field2 : {0}",sc.Field2);
}
}
}
internal class class1
{
static void Main(string[] args)
{
SomeClass sc = new SomeClass();
sc.PrintMyMembers();
}
}
(注:内容学习总结自《C#图解教程》)