c#嵌套类的使用


1.基本概念

嵌套类:在一个类中定义另一个类,分为静态嵌套类(使用少)和非静态嵌套类(又称内部类)。

内部类: (1) 在一个类中直接定义类。

2) 在一个方法中定义类。
3) 匿名内部类。

2. 嵌套类的使用

(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"; //实例成员

}

}

}

3. 嵌套类访问外部类实例的方法、字段、属性时候。一般在采取构造函数输入外部类

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");


 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM