高賢君 譚美淋 蔡永香
摘要:針對C#程序設(shè)計(jì)中集合與泛型章節(jié)教學(xué)中存在知識點(diǎn)繁多、關(guān)聯(lián)性差且實(shí)踐要求高等問題,文章引入面向?qū)ο蟮乃枷?,剖析泛型的由來及發(fā)展趨勢,對集合與泛型知識點(diǎn)進(jìn)行梳理,重新組織教學(xué)思路與結(jié)構(gòu),厘清知識點(diǎn)之間的相互關(guān)系。并通過改進(jìn)課堂講授方法,增加課堂交互及學(xué)生授課活動(dòng)等手段,鍛煉學(xué)生的編程思維能力,提高學(xué)生對知識點(diǎn)的理解、興趣及實(shí)踐水平。對學(xué)生進(jìn)行該部分知識點(diǎn)上機(jī)測試教學(xué)評價(jià),取得良好的教學(xué)效果。
關(guān)鍵詞:GIS教學(xué)研究;面向?qū)ο?集合與泛型;C#程序設(shè)計(jì)
中圖分類號:TP311? ? ? ? 文獻(xiàn)標(biāo)識碼:A
文章編號:1009-3044(2022)22-0122-02
《C#程序設(shè)計(jì)》是一門本科地理信息科學(xué)(Geography Information Science, GIS)專業(yè)第四學(xué)期開設(shè)的必修課,筆者所在的長江大學(xué)地球科學(xué)學(xué)院在制定地理信息科學(xué)專業(yè)教學(xué)大綱時(shí),充分顧及專業(yè)特色和實(shí)踐開發(fā)并重培養(yǎng)模式,將專業(yè)課程劃分為:地理學(xué)、計(jì)算機(jī)科學(xué)、測量與遙感學(xué)等體系課程組[1],強(qiáng)調(diào)學(xué)生掌握地球科學(xué)、測繪、遙感、地信基本原理與方法,同時(shí)需具備一定的編程實(shí)踐動(dòng)手能力,為將來從事科研或開發(fā)類的工作奠定良好的基礎(chǔ)[2-4]。
《C#程序設(shè)計(jì)》的先修課程包括《計(jì)算機(jī)基礎(chǔ)》《C程序設(shè)計(jì)》《數(shù)據(jù)結(jié)構(gòu)》和《數(shù)據(jù)庫原理與方法》等一系列計(jì)算機(jī)相關(guān)課程。本課程共有72學(xué)時(shí),其中理論52學(xué)時(shí)與實(shí)踐20學(xué)時(shí)。集合與泛型是本課程第六章的內(nèi)容,共6學(xué)時(shí),其中4學(xué)時(shí)的理論講授及示例演示與2學(xué)時(shí)上機(jī)實(shí)習(xí)。其處在面向?qū)ο蠡A(chǔ)與高級章節(jié)之后,后續(xù)章節(jié)包括Windows應(yīng)用窗體、圖形設(shè)備接口(Graphics Device Interface, GDI+)、數(shù)據(jù)庫操作(ActiveX Data Objects.NET, ADO.NET)等。集合與數(shù)組的功能相似,不同之處在于集合類中封裝了豐富的對集合元素操作方法,如增加、刪除、移動(dòng)元素等[6]。泛型是指泛化的數(shù)據(jù)類型,即引入了類型參數(shù)的概念,可以在編譯期間由一個(gè)類型定義派生出許多特定的類型[7]。由于本章內(nèi)容對實(shí)際編程開發(fā)工作具有重要價(jià)值和意義,因此需要學(xué)生熟練掌握,然而該章節(jié)內(nèi)容具有知識點(diǎn)繁多,且關(guān)聯(lián)性較差等特點(diǎn),給學(xué)生理解與運(yùn)用該部分內(nèi)容造成困難,本章節(jié)教學(xué)目標(biāo)是能理解并熟練操作常見集合與泛型類及方法。
1 目前集合與泛型章節(jié)教學(xué)中存在的問題
(1) 集合與泛型類庫更替易產(chǎn)生混淆
泛型集合類C#.NET 1.0和2.0及以上版本改版較大,嚴(yán)格來說,由于1.0版本中的集合類庫所存在的缺陷,導(dǎo)致微軟公司推薦使用2.0版本。如何快速區(qū)分類庫的版本,給初學(xué)者來帶來理解困難[8]。
(2) 集合與泛型知識點(diǎn)較多,且關(guān)聯(lián)性不強(qiáng),不宜學(xué)生理解
泛型所在System.Collections.Generic命名空間中包含了定義泛型的接口和類,可允許用戶創(chuàng)建強(qiáng)類型集合,以提供比泛型強(qiáng)類型集合更好的類型安全性和性能。包有CollectionExtensions和Comparer
(3) 缺乏完善有效實(shí)踐方案
在有限的學(xué)時(shí)情況下,如何讓學(xué)生理解與掌握集合與泛型,且會運(yùn)用常見的類與接口,是一個(gè)需要值得探討的問題。需要設(shè)計(jì)切實(shí)的案例供學(xué)生快速掌握泛型集合的使用方法,制定完善有效的實(shí)踐方案,促進(jìn)學(xué)生對集合與泛型知識點(diǎn)的深刻理解與運(yùn)用。
2 構(gòu)建知識點(diǎn)結(jié)構(gòu)及關(guān)聯(lián)關(guān)系
針對以上問題,需對集合與泛型知識點(diǎn)進(jìn)行重新梳理,突出面向?qū)ο笏枷朐诩吓c泛型理解中的作用,著力實(shí)踐能力的培養(yǎng),設(shè)計(jì)該章節(jié)教學(xué)主線,引導(dǎo)學(xué)生積極完成實(shí)踐任務(wù)。如圖 1所示,本文將章節(jié)的講解分為三部分,首先引入數(shù)組的概念,講解集合,并介紹涉及的關(guān)鍵類(如:ArrayList與Hashtable類) 、接口、結(jié)構(gòu)等,然后分析集合的缺陷,過渡到泛型的講解,重點(diǎn)介紹涉及List
2.1 以面向?qū)ο笏枷霕?gòu)建集合類ArrayList與Hashtable的解析
面向?qū)ο笏枷胧秦灤┯?jì)算機(jī)程序設(shè)計(jì)的一種重要思想,典型的面向?qū)ο笏枷氲恼Z言包括有C#、Java、C++、Python等。面向?qū)ο笏枷氚庋b、繼承、多態(tài)三大原則[6]。面向?qū)ο笞鳛椤禖#程序設(shè)計(jì)》課程的重點(diǎn)內(nèi)容,理論課教學(xué)比重也是最大的,共計(jì)14學(xué)時(shí)完成課堂教學(xué)。由于上一章節(jié)中系統(tǒng)地講解了面向?qū)ο笾蓄惖挠蓙?、特點(diǎn)及類的方法與事件等,因此學(xué)生在面向?qū)ο笏枷氲睦斫馍嫌休^好的基礎(chǔ)。
引入面向?qū)ο蟮乃枷胫良项惖闹v解中,System.Collections命名空間包含定義各種對象集合(如列表、隊(duì)列、位數(shù)組、哈希表和字典) 的類和接口[10]。由于該部分內(nèi)容涉及的類和接口較多。因此,只能選取具有一定代表性的類和接口進(jìn)行課堂講解,本文選取常見的集合類和接口進(jìn)行講解,主要包括ArrayList、Hashtable和IList。如表 1所示:
2.2 裝箱與拆箱等強(qiáng)制類型轉(zhuǎn)換操作的弊端及泛型的由來
早期C#.NET 1.0版本采用object類型實(shí)現(xiàn)參數(shù)的“任意化”,此方式優(yōu)勢是能夠處理一切數(shù)據(jù)類型的強(qiáng)制轉(zhuǎn)換,原因是C#中一切數(shù)據(jù)類型都直接或間接地繼承于object類型。以列表ArrayList的添加操作為例,如下代碼所示:
1? ? ArrayList list1=new ArrayList(); //聲明及實(shí)例化
2? ? list1.Add(44);? ? ? ? ? ? ? ? //裝箱
3? ? int i=(int)list1[0];? ? ? ? ? ? ?//拆箱
4? ? list1.Add(“ABC”);? ? ? ? ?//裝箱
5? ? foreach(int j in list1){}? ? ? ? //執(zhí)行報(bào)錯(cuò)
可以看到,向list1中添加整型數(shù)據(jù)44,涉及兩個(gè)重要的操作分別是裝箱與拆箱。裝箱是指講值類型轉(zhuǎn)換成引用類型發(fā)生的操作;拆箱是指引用類型轉(zhuǎn)換成值類型發(fā)生的操作。第2行代碼中,裝箱操作具體是將整型數(shù)據(jù)44轉(zhuǎn)換成object類型;第3行代碼中,拆箱操作具體是將list1第0位置上的object類型強(qiáng)制轉(zhuǎn)換為整型數(shù)據(jù)并賦給變量i,程序編譯通過,然而帶來運(yùn)行風(fēng)險(xiǎn),即必須事先確定每個(gè)元素的數(shù)據(jù)類型。如第4行代碼中向list1中加入字符串類型“ABC”,在第5行代碼中遍歷所有元素,編譯這些代碼不會出現(xiàn)編譯錯(cuò)誤,然而在運(yùn)行時(shí)將報(bào)出異常,導(dǎo)致程序崩潰,原因是在拆箱第2個(gè)元素時(shí),直接強(qiáng)制轉(zhuǎn)換為整型類型將會出錯(cuò),字符串類型“ABC”無法轉(zhuǎn)換為整型類型。
采用裝箱與拆箱操作可能發(fā)生異常,帶來代碼的不安全,不僅如此大量的裝箱和拆箱操作會加大系統(tǒng)開銷,C#.NET 2.0后,通過將泛型類型一致化處理,能夠有效提高代碼運(yùn)行的安全性和節(jié)省系統(tǒng)頻繁裝箱和拆箱操作的開銷,且能有效提高代碼復(fù)用性。
以List
1? ? List
2? ? parts.Add(new Part() {PartName="crank arm", PartId=1234}); //添加第一個(gè)元素
3? ? parts.Add(new Part() {PartName ="chain ring", PartId=1334}); //添加第二個(gè)元素
4? ? foreach (Part aPart in parts) { Console.WriteLine(aPart); } //遍歷parts中的所有元素。
從以上代碼可以看出,第4行代碼進(jìn)行元素遍歷時(shí),代碼安全,不會在編譯或執(zhí)行過程中報(bào)錯(cuò),原因在于parts為泛型集合類List
1? ? Dictionary
2? ? openWith.Add("txt", "notepad.exe");
3? ? openWith.Add("bmp", "paint.exe");
4? ? foreach( KeyValuePair
可以看出,第4行代碼中遍歷openwith字典中的所有鍵值,這里引進(jìn)了類keyValuePair,實(shí)現(xiàn)對鍵與值的同步索引。
2.3 教學(xué)效果評價(jià)
對集合與泛型章節(jié)的教學(xué)改革,主要包括梳理知識點(diǎn),講解泛型的歷史,面向?qū)ο蠹项惖慕馕龊脱b箱、拆箱操作分析等。本文設(shè)計(jì)多級教學(xué)效果評價(jià)指標(biāo),綜合評價(jià)提出集合與泛型章節(jié)改革教學(xué)方法。如表 2所示,可見設(shè)計(jì)3項(xiàng)一級指標(biāo)具體包括案例質(zhì)量、教學(xué)過程與教學(xué)收獲。每項(xiàng)一級指標(biāo)下包含若干二級指標(biāo)。不同指標(biāo)分配不同的權(quán)重,如一級指標(biāo)的權(quán)重比為0.232:0.374:0.394。
對涉及的重點(diǎn)類與接口用案例進(jìn)行評價(jià),如ArrayList采用班級學(xué)生成績數(shù)組引入,Dictionary采用身份證查詢某人的全部信息,并結(jié)合示例代碼演示,取得良好的效果。重視教學(xué)過程評價(jià),對教學(xué)環(huán)節(jié)合理性、課堂討論活躍度、教學(xué)啟發(fā)深度等進(jìn)行評價(jià)。將學(xué)生成績中的90~100余75~89之間的學(xué)生參與調(diào)查結(jié)果進(jìn)行改革前后觀測,結(jié)果如表 3所示。從整體上課,改革后集合與泛型教學(xué)效果良好,相比于之前有更好的教學(xué)過程與收獲。如圖 2所示,可以看出改革后的兩個(gè)成績段各評價(jià)指標(biāo)基本猶豫未改革前的情況。
3 結(jié)論
針對C#程序設(shè)計(jì)中集合與泛型章節(jié)教學(xué)中存在知識點(diǎn)繁多、關(guān)聯(lián)性差且實(shí)踐要求高等問題,采用面向?qū)ο蟮乃枷?,對集合與泛型知識點(diǎn)進(jìn)行梳理,重新組織教學(xué)思路與結(jié)構(gòu),厘清知識點(diǎn)之間的相互關(guān)系。對學(xué)生進(jìn)行該部分知識點(diǎn)教學(xué)效果評價(jià),取得良好的教學(xué)效果。
參考文獻(xiàn):
[1] 高賢君,楊元維.C#程序設(shè)計(jì)課程數(shù)據(jù)庫編程技術(shù)教學(xué)研究[J].電腦知識與技術(shù),2020(8):165-167.
[2] 高賢君,楊元維,李功權(quán).面向計(jì)算思維的Web程序設(shè)計(jì)教學(xué)思考[J].電腦知識與技術(shù),2018,14(21):141-143.
[3] 楊元維,高賢君.GIS專業(yè)C#程序設(shè)計(jì)課程任務(wù)驅(qū)動(dòng)式教學(xué)研究[J].電腦知識與技術(shù),2020(7):176-178.
[4] 楊元維,高賢君.計(jì)算思維在WebGIS開發(fā)與應(yīng)用教學(xué)中的研討[J].電腦知識與技術(shù),2018(10):100-101,109.
[5] 岳大為.自定義集合類和泛型集合類在.Net開發(fā)中的應(yīng)用比較[J].電腦編程技巧與維護(hù),2016(15):8,19.
[6] 唐大仕.C#程序設(shè)計(jì)教程[M].2版.北京:清華大學(xué)出版社,2018.
[7] 徐安東.Visual C#程序設(shè)計(jì)基礎(chǔ)[M].北京:清華大學(xué)出版社,2012.
[8] 朱德君,羅勇,吳平貴.淺談C#的泛型[J].電腦知識與技術(shù),2010,6(23):6521-6523.
[9] 姜宇,牟永敏.C#2.0泛型集合的應(yīng)用研究[J].微計(jì)算機(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
【通聯(lián)編輯:王力】