在一个类或类的方法中定义另一个类,分为静态嵌套类(使用少)和非静态嵌套类(又称内部类)。
嵌套类是外部类的补充,通过嵌套类可以获取更好的封装性,增加外部类的可维护性和可读性,为类管理提供除命名空间外的另一种方法。
- 外部类只能够访问嵌套类中修饰符为
public
、internal
的成员(直接访问类的静态成员和通过实例访问非静态成员)。
public class Animal
{
static void Set_Animal()
{
var monkey = new Monkey();
//编译正确
monkey.show();
Monkey._high = 123;
Monkey._age = 4;
monkey.high = 123;
monkey.age = 4;
//编译失败
Monkey._name = "hoho";
Monkey._sex = "hoho";
monkey.name = "hoho";
monkey.sex = "hoho";
}
private class Monkey
{
private static string _name;
private string name;
protected static string _sex;
protected string sex;
internal static int _age;
internal int age;
public static int _high;
public int high;
public Monkey() { }
public void show() { }
}
}
- 嵌套类可以随意访问外部类的成员而不受访问修饰符的限制,一般在采取构造函数输入外部类
public class Animal
{
private static int _Age;
private string name;
public Animal()
{
new Monkey(this);
}
/*嵌套类 定义*/
class Monkey
{
public int aaa = _Age;
public Monkey(Animal a)
{
_Age = 23;//静态成员
a.name = "test"; //实例成员
}
}
}
- 外部类的派生类中的嵌套类可以继承其嵌套类,前提是父嵌套类是可继承类且可访问(非private 、sealed、static)。
public class Animal
{
//*嵌套类 定义*/
protected class monkey
{
public virtual void Method()
{
Console.WriteLine("monkey");
}
}
}
public class S_Animal : Animal
{
class s_monkey : monkey
{
public override void Method()
{
Console.WriteLine("s_monkey");
}
}
}
- 类似命名空间的嵌套,其他类可以通过
<外部类>.<嵌套类>
的方式访问嵌套类(需注意此时嵌套类的保护级别)。
using System;
namespace Father
{
namespace Child
{
class Program
{
static void Main(string[] args)
{
var c = new F.C();//其完全限定名称为 Father.Child.F.C
Console.WriteLine(c.age);//18
}
}
class F
{
public class C
{
public int age = 18;
}
}
}
}