1.基本概念
嵌套类:在一个类中定义另一个类,分为静态嵌套类(使用少)和非静态嵌套类(又称内部类)。
内部类:
(1) 在一个类中直接定义类。
(2) 在一个方法中定义类。
(3) 匿名内部类。
-
嵌套类的使用
(1)外部类只能够访问嵌套类中修饰符为public、internal的字段、方法、属性。示例如下
public class Animal
{
static void Set_Animal()
{
//编译正确
Monkey._high = 123;
Monkey._age = 4;
//编译失败
Monkey._name = “hoho”;
}private class Monkey { private static string _name; protected string _sex; internal static int _age; public static int _high; public Monkey() { } public void show() { } }
}
(2)嵌套类可以访问外部类的方法、属性、字段而不受访问修饰符的限制
public class Animal
{
private static int _Age;
private string name;
private static void DoSomething()
{
Console.WriteLine(_Age);
}
private void DoStr()
{
monkey.method(this);
}
/*嵌套类 定义*/
class monkey
{
public static void method(Animal a)
{
_Age = 23; //静态成员
a.name = "test"; //实例成员
}
}
}
-
嵌套类访问外部类实例的方法、字段、属性时候。一般在采取构造函数输入外部类
public class Animal
{
private string _name;//嵌套类 定义/
class monkey
{
public monkey(Animal a)
{
a._name = “test”;
}
}
}
4.继承类可以再定义一个内嵌类并从继承父类中嵌套类
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");
}
}
}注:因为S_Animal 继承于Animal ,因此s_monkey可以继承monkey类,从而获取重写父嵌套类的机会。但是monkey必须是可继承类及可访问的(非private 、sealed、static)。
嵌套类可以随意外部类的任何数据属性,而外部类访问嵌套类就只能遵守访问修饰符。从这个角度看,嵌套类是外部类的补充,通过嵌套类可以获取更好的封装性,增加外部类的可维护性和可读性。
从程序结构看,嵌套类在逻辑上更加接近使用类。可以更有效地表示类与类之间的紧密程度。为类管理提供除命名空间外的另一种方法。
5.单例模式(singleton)就采用一种为 延迟加载初始化实例 的方法如下:
public class Animal
{
public Animal(){}
public static Animal Intance
{
get { return monkey._intance; }
}
class monkey
{
public readonly static Animal _intance = new Animal();
}
}注: 延迟加载 嵌套类的静态构造函数不会随着外部类的触发而初始化。因此可以有效地避免创建时候初始化时间,当需要使用内嵌类的时候,嵌套类才开始初始化。
6.反射内嵌类需要使用"+"而不是我们常使用的"." 。
namespace AnimalClass
{
public class Animal
{
public class monkey
{
protected void Method()
{
//do something...
}
}
}
}
注://成功
object o1 = System.Activator.CreateInstance("AnimalClass", "AnimalClass.Animal+monkey");
//失败 抛出System.TypeLoadException 异常
object o2 = System.Activator.CreateInstance("AnimalClass", "AnimalClass.Animal.monkey");
转载自:http://www.xinyingde.com/Article/715.Html