




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
嵌套类(Nested Class)是在类中定义的类。以下把拥有内嵌类的类称为外部类。嵌套类分为静态嵌套类和非静态嵌套类,其中非静态嵌套类也被称为内部类。嵌套类在UML中是composite的另外一种代码表示形式,表示耦合度更高,并且与外部类更加紧密。一般类的访问修饰符可以定义为默认的internal或者public,而内嵌类就有比较多的选择,可以是为protected、internal、public以及默认的private。内嵌类与外部类的访问限制嵌套类可以访问外部类的方法、属性、字段而不管访问修饰符的限制。如: public class A private static int _AInt; private int _instanceInt; private static void AMethod() Console.WriteLine(_AInt); public void SayIt() NestedA.Method(this); private class NestedA public static void Method(A a) /静态成员 _AInt = 100; AMethod(); /实例成员 a._instanceInt = 10; a.SayIt(); 但是外部类只能够访问修饰符为public、internal嵌套类的字段、方法、属性。示例如下: public class A public static void AMethod() /成功 NestedA.StaticMethod(); /编译报错 NestedA._Int = 100; NestedA ins=new NestedA(); /成功 ins.Method(); /编译报错 ins._instanceInt = 100; private class NestedA private static int _Int; private int _instanceInt; public static void StaticMethod() public void Method() 嵌套类访问外部类实例的方法、字段、属性时候。一般在采取构造函数输入外部类。如下: public class A private int _a; private class NestedA public NestedA(A a) a._a = 9; 继承继承类,也就是继承类外部类的类,只能使用父类中嵌套类的public或者internal(同一个程序集合)方法。但是继承类可以再定义一个内嵌类并从继承父类中嵌套类。如: public class A protected class Nested protected virtual void BaseNested_Method() public class C : A protected class C_Nested:Nested protected override void BaseNested_Method() /重写部分 因为C中A中继承,因此C_Nested可以继承Nested类,从而获取重写父嵌套类的机会。但是Nested必须是可继承类及可访问的(非private 、sealed、static)。嵌套类可以随意访问外部类的任何数据属性,而外部类访问嵌套类就只能遵守访问修饰符。从这个角度看,嵌套类是外部类的补充,通过嵌套类可以获取更好的封装性,增加外部类的可维护性和可读性。从程序结构看,嵌套类在逻辑上更加接近使用类。可以更有效地表示类与类之间的紧密程度。为类管理提供除命名空间外的另一种方法。懒加载嵌套类的静态构造函数不会随着外部类的触发而初始化。因此可以有效地避免创建时候初始化时间,当需要使用内嵌类的时候,嵌套类才开始初始化。public class Outside static Outside() Console.WriteLine(Outside Inilizlized); public void SayIt() Nested.Run(); private class Nested /静态构造函数用于初始化任何静态数据,或用于执行仅需执行一次的特定操作。在创建第一个/实例或引用任何静态成员之前,将自动调用静态构造函数。 static Nested() Console.WriteLine(Nested initilized); public static void Run() Console.WriteLine(Nested Run); 执行结果Outside o = new Outside(); /打印Outside InilizlizedConsole.ReadLine();o.SayIt();/首先打印Nested initilized 再打印 Nested RunConsole.ReadLine();一般应用这个特性会在一些C#单例模式中找到,而这种模式可以被称为Fully lazy singleton模式。下面是简单的演示代码(Singleton模式可以在这里有更加详细的解释): public class Singleton public static Singleton Instance get return Nested.instance; private class Nested public readonly static Singleton instance=new Singleton(); 反射反射内嵌类需要使用+而不是我们常使用的. ,如A类在名称为InsideClass的Assembly中。namespace InsideClass public class A public class Nested protected void BaseNested_Method() 执行/成功object o1 = System.Activator.CreateInstance(InsideClass, InsideClass.A+Nested);/失败 抛出System.TypeLoadException异常object o2 = System.Activator.CreateInstance(InsideClass, InsideClass.A.Nested);结构体的嵌套(以下的例子中,每个结构体、联合,都可以换成结构体联合、或者类)一.结构体的声明与定义变量的方法 1.常规方法 struct AA int a; int b; 此时定义变量可以 AA aa; 调用成员 aa.a; aa.b; 2.也可以现在结构体尾部定义一个或者几个变量。 struct CC int a; int b; x1,x2; 此时x1,x2就是已经定义好的ccc类型的变量了,这种情况在声明时struct前就一定不能加typedef,如果加上了,x1,x2就成了和CC一样的结构体类型了,而不是变量了。 3.无名结构体,指的是此结构体在声明是没有写名字的情况。 这时如果结构体不是子结构体,那么就必须定义一个变量,用第二种方法。否则此结构体无意义了。 如果此结构体是子结构体,那么此结构体可以定义变量,也可以不定义。如果不定义变量,那么它的成员就会被当成父结构体的直接成员,直接调用。如果定义变量,那么就要通过两级调用才能调用这个结构图的成员。 4. 用typedef 的情况。这种情况,定义变量必须在结构体声明之后定义。 使用typedef 可以在结构体外部顺便定义此结构体的别名,指针类型,二级指针类型,数组类型等等。 typedef struct _ABC int a; int b; ABC,*pABC,ABC_ARRY20; 注意和第二种情况的区别,一个是实例,一个是类型。二.结构体嵌套使用方法 1.可以先把子结构体在父结构体之外声明,然后就在父结构体内部把子结构体当成一个普通类型来使用就可以了,不过此时子结构体必须有名字。这样的好处就是可以在父结构体内部定义多个子结构体类型的成员变量。 这时调用子结构体的变量就得通过两级调用了。即aa.order.first;struct ORDER BYTE first; BYTE second; BYTE third; BYTE forth;bb; union OpcondOrder DWORD data; ORDER order; aa; 2.把子结构体在父结构体内部定义的情况。 a. 如果内部定义的子结构体没有名字,那么定义完父结构体后,就把子结构体的成员当成父结构体的第一级成员(直接成员)来调用就行了。此时子结构体不能定义变量。 union OPCODEORDER DWORD data; struct BYTE forth;BYTE third;BYTE second;BYTE first; ; aa; 这时就可这样调用:aa.first;aa.second; 直接当成自己的一级成员来用。 如果此时作为子结构体的 无名结构体定义了变量,那么就需要二级调用才能够调用无名结构体的成员。union OPCODEORDER DWORD data; struct BYTE forth;BYTE third;BYTE second;BYTE first; cc;aa;这时调用就需要: aa.cc.first;aa.cc.second;当成父结构体的二级成员调用。 b. 对于内部定义的结构体有名字的情况,如果此有名子结构体没有定义变量,那么在调用的时候,就要通过二级调用,而且第二级调用要用类作用有区分符(:),否则会报错。union OPCODEORDER DWORD data; struct ORDERBYTE forth;BYTE third;BYTE second;BYTE first;aa; 此时就得这样调用 aa.ORDER:first;aa.ORDER:second;aa.ORDER:third; 如果有名字的结构体定义了变量,那么调用时也是通过两种二级调
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 店铺经营转让协议8篇
- 2025湖南有色产业投资集团郴州有限责任公司资兴西坌矿业有限公司招聘8人笔试参考题库附带答案详解
- 2025浙江宁波市卓众人力资源服务公司销售业务人员专项招募20人笔试参考题库附带答案详解
- 2025榆林定边县国有企业财务会计人员招聘(10人)笔试参考题库附带答案详解
- 2025年芜湖官陡梦湖产业服务有限公司招聘5人笔试参考题库附带答案详解
- 2025年山东省国控设计集团有限公司招聘3人笔试参考题库附带答案详解
- 2025年合肥市建设工程监测中心有限责任公司社会招聘6人笔试参考题库附带答案详解
- 2025山东潍坊市天成水利建设有限公司招聘30人查看职位笔试参考题库附带答案详解
- 2025四川雅安市宝兴县兴绿林业投资有限公司招聘(第二批)2人笔试参考题库附带答案详解
- 2025内蒙古包钢房产物业集团有限公司招聘35名工作人员笔试参考题库附带答案详解
- 小学教育课件教案雪雕和冰雕的历史与传统
- 新版出口报关单模板
- 员工工资条模板
- 新教科版科学六年级上册知识点
- 初中历史小论文现状分析与写作探讨
- 新疆地方史课件
- 一粒种子旅行
- GB/T 9124-2010钢制管法兰技术条件
- GB 4287-1992纺织染整工业水污染物排放标准
- 腰椎间盘突出症课件
- 桂阳县中小幼教师资格定期注册工作指南专家讲座
评论
0/150
提交评论