




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本章常见错误
本讲大纲:1、使用结构实现接口的问题支持网站:2、构造方法中调用虚方法的错误3、泛型在不被指定的情况下是不确定的类型?使用结构实现接口的问题(1)结构与类有一个重要的区别是结构不支持继承,也就是说不可以定义一个继承自类或其它结构的结构。根据这个区别,有些人会作出这样的推理:既然结构不支持继承,那么当然也不可以实现接口。果真如此吗?如下面的例子所示。使用结构实现接口,具体代码如下:classProgram{staticvoidMain(string[]args){TestStructts=newTestStruct();//创建结构TestStruct的实例
Console.WriteLine("遍历并输出结构中的内容:");foreach(intitemints)//遍历TestStruct结构中的内容
{Console.WriteLine(item);//输出内容
}Console.Read();}}//结构实现IEnumerable接口structTestStruct:IEnumerable{publicIEnumeratorGetEnumerator()//实现IEnumerable中的方法,创建迭代器
{int[]ints=newint[]{0,1,2};for(inti=0;i<ints.Length;i++)//循环数组
{yieldreturnints[i];//使用yieldreturn语句依次返回每个元素
}}}使用结构实现接口的问题(2)上面的代码中,首先创建一个实现了IEnumerable接口的结构,并通过实现接口的GetEnumerator方法使该结构具有迭代的功能,然后在Main方法中实例化该结构,最后使用foreach语句遍历该结构的内容。编译和运行上面的程序,一切都正常,运行结果如图所示。
从运行结果中得出的结论就是,结构不支持继承,但可以实现接口。构造方法中调用虚方法的错误(1)
C#是一种完全面向对象的语言,构造函数和虚方法都是面向对象中非常重要的元素,构造方法用来创建对象,虚方法常用来在子类中被重写。如果在构造方法中调用虚方法,就会引起错误。例如,下面演示在构造方法中调用虚方法,实现过程如下:首先在Program.cs类文件中编写3个类,名称分别为Ref、Parent、Child,这3个类的关系如图所示。
在这3个类中,Parent是Child的基类(或超类),Child是Parent的子类(或派生类),在这两个类中都有对Ref类的引用。下面是这3个类的代码:
构造方法中调用虚方法的错误(2)
publicclassRef{publicstringStr="这是Ref类的一个成员";}publicclassParent//定义基类{protectedRefmy;publicParent()//构造方法
{my=newRef();Console.WriteLine(GetString());//构造方法中调用了虚方法
}publicvirtualstringGetString()//虚方法
{returnmy.Str;//使用了内部成员
}}publicclassChild:Parent//定义子类,继承自Parent{privateRefmy2;publicChild():base(){my2=newRef();}publicoverridestringGetString()//重写虚方法
{returnmy2.Str;//使用了内部成员
}}
说明:在Parent类的构造方法中,调用了虚方法GetString。
构造方法中调用虚方法的错误(3)在Main方法中编写实例化Child类的代码,具体代码如下:classProgram{staticvoidMain(string[]args){try{Childch=newChild();//实例化Child类
}catch(Exceptionex){Console.WriteLine(ex.Message);}Console.Read();}}上面的代码在编译时,没有任何问题,但在执行时却出现了异常,如图所示。在程序的Main方法中设置断点,跟踪断点时发现,在执行Child类的构造函数代码之前,先执行Parent类的构造函数,当执行到调用虚方法的代码时,突然断点跳转到Child类的GetString方法体内,在执行该方法体中的my2.str代码时出错,因为my2在Child类的构造函数中被实例化,而此时代码还未执行到Child类的构造函数,所以出现上面的异常。该错误的解决方法只有一个,那就是永远不要在子类的构造函数中调用虚方法。
泛型在不被指定的情况下是不确定的类型?(1)为了使集合的功能更强大,也为了提高它们的效率和可用性,在C#中引入了泛型。泛型简言之就是将类型参数化,以达到代码复用为目的的一种数据类型,它参数化类型,使类型抽象化,从而使其对外表现出更加灵活的功能。泛型的种类很广泛,包括泛型接口、泛型类、泛型方法、泛型事件和泛型委托等。泛型的语法和概念非常类似于C++中的模板,都是为了方便设计一些更加通用的类型,而在C#中泛型还有另外一个重要作用,那就是避免容器操作中的装箱和拆箱动作。例如,使用泛型的代码如下://定义泛型类publicclassGenericClass<T>{Ttt;//构造器
publicGenericClass(Tt){tt=t;}//覆盖或重写ToString方法
publicoverridestringToString(){returntt.ToString();}}泛型在不被指定的情况下是不确定的类型?(2)下面是GenericClass类的调用代码:staticvoidMain(string[]args){GenericClass<string>gc=newGenericClass<string>("明日科技");//创建泛型对象
Console.WriteLine(gc);//输出字符串
Console.Read();}
说明:上面代码中为泛型传入一个string类型的实参,实际上可以传入任意类型的实参,如int类型,代码如下:GenericClass<int>gc=newGenericClass<int>(999);上面代码中声明了一个泛型GenericClass<T>,有些人会认为GenericClass<T>是一个不确定类型。这是对泛型的一种误解,和C#中的众多类型一样,带泛型参数的类型同样是一个确定的类型,在不被指定的情况下,它直接继承自System.Object类型,也就是说GenericClass<T>是System.Object类型。但是,泛型类型还是和普通类型有一定
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- C语言实践案例分析试题及答案
- 逻辑能力提升与企业财务表现的关联性试题及答案
- 2025年计算机VFP考试重点解析试题及答案
- 北师大七年级数学下册导学案
- JAVA机器智能助力下的编码精简技巧试题及答案
- 2025年JAVA信息系统设计试题及答案
- 嵌入式系统中实时调度试题及答案
- 敏捷环境下的测试协作模式试题及答案
- 精通MySQL数据库的实战试题及答案
- 店面转租合同协议书图片
- “成于大气 信达天下”-成信校史课程知到课后答案智慧树章节测试答案2025年春成都信息工程大学
- GB/T 5973-2006钢丝绳用楔形接头
- GB/T 3917.2-2009纺织品织物撕破性能第2部分:裤形试样(单缝)撕破强力的测定
- GB/T 27024-2014合格评定人员认证机构通用要求
- 钢箱梁焊接作业指导书
- GB 34660-2017道路车辆电磁兼容性要求和试验方法
- BB/T 0034-2017铝防盗瓶盖
- 国家义务教育质量监测科学模拟测试题附答案
- 12-1限度样品管理办法
- UI界面设计交互设计教学
- 钢箱梁计算分析与案例详解
评论
0/150
提交评论