GIS专业C#程序设计课程中集合与泛型教学思考
2022-05-30高贤君谭美淋蔡永香
高贤君 谭美淋 蔡永香
摘要:针对C#程序设计中集合与泛型章节教学中存在知识点繁多、关联性差且实践要求高等问题,文章引入面向对象的思想,剖析泛型的由来及发展趋势,对集合与泛型知识点进行梳理,重新组织教学思路与结构,厘清知识点之间的相互关系。并通过改进课堂讲授方法,增加课堂交互及学生授课活动等手段,锻炼学生的编程思维能力,提高学生对知识点的理解、兴趣及实践水平。对学生进行该部分知识点上机测试教学评价,取得良好的教学效果。
关键词:GIS教学研究;面向对象;集合与泛型;C#程序设计
中图分类号:TP311 文献标识码:A
文章编号:1009-3044(2022)22-0122-02
《C#程序设计》是一门本科地理信息科学(Geography Information Science, GIS)专业第四学期开设的必修课,笔者所在的长江大学地球科学学院在制定地理信息科学专业教学大纲时,充分顾及专业特色和实践开发并重培养模式,将专业课程划分为:地理学、计算机科学、测量与遥感学等体系课程组[1],强调学生掌握地球科学、测绘、遥感、地信基本原理与方法,同时需具备一定的编程实践动手能力,为将来从事科研或开发类的工作奠定良好的基础[2-4]。
《C#程序设计》的先修课程包括《计算机基础》《C程序设计》《数据结构》和《数据库原理与方法》等一系列计算机相关课程。本课程共有72学时,其中理论52学时与实践20学时。集合与泛型是本课程第六章的内容,共6学时,其中4学时的理论讲授及示例演示与2学时上机实习。其处在面向对象基础与高级章节之后,后续章节包括Windows应用窗体、图形设备接口(Graphics Device Interface, GDI+)、数据库操作(ActiveX Data Objects.NET, ADO.NET)等。集合与数组的功能相似,不同之处在于集合类中封装了丰富的对集合元素操作方法,如增加、删除、移动元素等[6]。泛型是指泛化的数据类型,即引入了类型参数的概念,可以在编译期间由一个类型定义派生出许多特定的类型[7]。由于本章内容对实际编程开发工作具有重要价值和意义,因此需要学生熟练掌握,然而该章节内容具有知识点繁多,且关联性较差等特点,给学生理解与运用该部分内容造成困难,本章节教学目标是能理解并熟练操作常见集合与泛型类及方法。
1 目前集合与泛型章节教学中存在的问题
(1) 集合与泛型类库更替易产生混淆
泛型集合类C#.NET 1.0和2.0及以上版本改版较大,严格来说,由于1.0版本中的集合类库所存在的缺陷,导致微软公司推荐使用2.0版本。如何快速区分类库的版本,给初学者来带来理解困难[8]。
(2) 集合与泛型知识点较多,且关联性不强,不宜学生理解
泛型所在System.Collections.Generic命名空间中包含了定义泛型的接口和类,可允许用户创建强类型集合,以提供比泛型强类型集合更好的类型安全性和性能。包有CollectionExtensions和Comparer
(3) 缺乏完善有效实践方案
在有限的学时情况下,如何让学生理解与掌握集合与泛型,且会运用常见的类与接口,是一个需要值得探讨的问题。需要设计切实的案例供学生快速掌握泛型集合的使用方法,制定完善有效的实践方案,促进学生对集合与泛型知识点的深刻理解与运用。
2 构建知识点结构及关联关系
针对以上问题,需对集合与泛型知识点进行重新梳理,突出面向对象思想在集合与泛型理解中的作用,着力实践能力的培养,设计该章节教学主线,引导学生积极完成实践任务。如图 1所示,本文将章节的讲解分为三部分,首先引入数组的概念,讲解集合,并介绍涉及的关键类(如:ArrayList与Hashtable类) 、接口、结构等,然后分析集合的缺陷,过渡到泛型的讲解,重点介绍涉及List
2.1 以面向对象思想构建集合类ArrayList与Hashtable的解析
面向对象思想是贯穿计算机程序设计的一种重要思想,典型的面向对象思想的语言包括有C#、Java、C++、Python等。面向对象思想包含封装、继承、多态三大原则[6]。面向对象作为《C#程序设计》课程的重点内容,理论课教学比重也是最大的,共计14学时完成课堂教学。由于上一章节中系统地讲解了面向对象中类的由来、特点及类的方法与事件等,因此学生在面向对象思想的理解上有较好的基础。
引入面向對象的思想至集合类的讲解中,System.Collections命名空间包含定义各种对象集合(如列表、队列、位数组、哈希表和字典) 的类和接口[10]。由于该部分内容涉及的类和接口较多。因此,只能选取具有一定代表性的类和接口进行课堂讲解,本文选取常见的集合类和接口进行讲解,主要包括ArrayList、Hashtable和IList。如表 1所示:
2.2 装箱与拆箱等强制类型转换操作的弊端及泛型的由来
早期C#.NET 1.0版本采用object类型实现参数的“任意化”,此方式优势是能够处理一切数据类型的强制转换,原因是C#中一切数据类型都直接或间接地继承于object类型。以列表ArrayList的添加操作为例,如下代码所示:
1 ArrayList list1=new ArrayList(); //声明及实例化
2 list1.Add(44); //装箱
3 int i=(int)list1[0]; //拆箱
4 list1.Add(“ABC”); //装箱
5 foreach(int j in list1){} //执行报错
可以看到,向list1中添加整型数据44,涉及两个重要的操作分别是装箱与拆箱。装箱是指讲值类型转换成引用类型发生的操作;拆箱是指引用类型转换成值类型发生的操作。第2行代码中,装箱操作具体是将整型数据44转换成object类型;第3行代码中,拆箱操作具体是将list1第0位置上的object类型强制转换为整型数据并赋给变量i,程序编译通过,然而带来运行风险,即必须事先确定每个元素的数据类型。如第4行代码中向list1中加入字符串类型“ABC”,在第5行代码中遍历所有元素,编译这些代码不会出现编译错误,然而在运行时将报出异常,导致程序崩溃,原因是在拆箱第2个元素时,直接强制转換为整型类型将会出错,字符串类型“ABC”无法转换为整型类型。
采用装箱与拆箱操作可能发生异常,带来代码的不安全,不仅如此大量的装箱和拆箱操作会加大系统开销,C#.NET 2.0后,通过将泛型类型一致化处理,能够有效提高代码运行的安全性和节省系统频繁装箱和拆箱操作的开销,且能有效提高代码复用性。
以List
1 List
2 parts.Add(new Part() {PartName="crank arm", PartId=1234}); //添加第一个元素
3 parts.Add(new Part() {PartName ="chain ring", PartId=1334}); //添加第二个元素
4 foreach (Part aPart in parts) { Console.WriteLine(aPart); } //遍历parts中的所有元素。
从以上代码可以看出,第4行代码进行元素遍历时,代码安全,不会在编译或执行过程中报错,原因在于parts为泛型集合类List
1 Dictionary
2 openWith.Add("txt", "notepad.exe");
3 openWith.Add("bmp", "paint.exe");
4 foreach( KeyValuePair
可以看出,第4行代码中遍历openwith字典中的所有键值,这里引进了类keyValuePair,实现对键与值的同步索引。
2.3 教学效果评价
对集合与泛型章节的教学改革,主要包括梳理知识点,讲解泛型的历史,面向对象集合类的解析和装箱、拆箱操作分析等。本文设计多级教学效果评价指标,综合评价提出集合与泛型章节改革教学方法。如表 2所示,可见设计3项一级指标具体包括案例质量、教学过程与教学收获。每项一级指标下包含若干二级指标。不同指标分配不同的权重,如一级指标的权重比为0.232:0.374:0.394。
对涉及的重点类与接口用案例进行评价,如ArrayList采用班级学生成绩数组引入,Dictionary采用身份证查询某人的全部信息,并结合示例代码演示,取得良好的效果。重视教学过程评价,对教学环节合理性、课堂讨论活跃度、教学启发深度等进行评价。将学生成绩中的90~100余75~89之间的学生参与调查结果进行改革前后观测,结果如表 3所示。从整体上课,改革后集合与泛型教学效果良好,相比于之前有更好的教学过程与收获。如图 2所示,可以看出改革后的两个成绩段各评价指标基本犹豫未改革前的情况。
3 结论
针对C#程序设计中集合与泛型章节教学中存在知识点繁多、关联性差且实践要求高等问题,采用面向对象的思想,对集合与泛型知识点进行梳理,重新组织教学思路与结构,厘清知识点之间的相互关系。对学生进行该部分知识点教学效果评价,取得良好的教学效果。
参考文献:
[1] 高贤君,杨元维.C#程序设计课程数据库编程技术教学研究[J].电脑知识与技术,2020(8):165-167.
[2] 高贤君,杨元维,李功权.面向计算思维的Web程序设计教学思考[J].电脑知识与技术,2018,14(21):141-143.
[3] 杨元维,高贤君.GIS专业C#程序设计课程任务驱动式教学研究[J].电脑知识与技术,2020(7):176-178.
[4] 杨元维,高贤君.计算思维在WebGIS开发与应用教学中的研讨[J].电脑知识与技术,2018(10):100-101,109.
[5] 岳大为.自定义集合类和泛型集合类在.Net开发中的应用比较[J].电脑编程技巧与维护,2016(15):8,19.
[6] 唐大仕.C#程序设计教程[M].2版.北京:清华大学出版社,2018.
[7] 徐安东.Visual C#程序设计基础[M].北京:清华大学出版社,2012.
[8] 朱德君,罗勇,吴平贵.浅谈C#的泛型[J].电脑知识与技术,2010,6(23):6521-6523.
[9] 姜宇,牟永敏.C#2.0泛型集合的应用研究[J].微计算机信息,2010,26(27):171-173,62.
[10] 微软公司. System.Collections命名空间(2022-02-10)[2022-02-10].https://docs.microsoft.com/zh-cn/dotnet/api/system.collections?view=net-6.0
【通联编辑:王力】