利用Visual C#和C#語言特性
Visual C#和C#語言特性
我們在招聘會上經(jīng)常看到這樣的要求:“熟練使用XX語言,有X萬行源碼經(jīng)驗(yàn)”。確實(shí),編碼行數(shù)在一定程度上反映了編程水平。那么,我們?nèi)绾螐臄?shù)以百計、千計的源程序中快速得知究竟有多少行呢?利用Visual C#和C#語言特性,我們可以輕松實(shí)現(xiàn)對多種類型的源代碼的行數(shù)的統(tǒng)計工作。
一、需求分析
程序需要用戶輸入要過濾的源程序的拓展名,選擇要統(tǒng)計的目錄。獲得信息后,程序需要遍歷指定目錄(及其子目錄)和目錄下的文件,這一過程可以用 System.IO.DirectoryInfo類來實(shí)現(xiàn)。對于符合過濾標(biāo)準(zhǔn)的文件,我們用StreamReader類來打開它們,每次讀取一行并計數(shù),直到EOF為止,于是便得到了文件的行數(shù)。
二、數(shù)據(jù)結(jié)構(gòu)與算法
對于每個過濾到的文件,我們用一個結(jié)構(gòu)來儲存其信息。
- struct codeInfo{
- public long line; //儲存這個源程序的行數(shù)
- public string ext; //這個文件的拓展名
- public string filename; //文件名
- public string fullname; //全路徑加文件名
- //篇幅所限,省略了仿“構(gòu)造函數(shù)”。
- }
對于用戶會輸入多少種拓展名,以及會有多少符合標(biāo)準(zhǔn)的文件,都是未知的。特別是對于每個文件都要動態(tài)構(gòu)造一個codeInfo結(jié)構(gòu)體,考慮到這些,我們用ArrayList來動態(tài)管理這些結(jié)構(gòu)體。
在算法上面,采用遞歸來實(shí)現(xiàn)無窮級目錄遍歷這一功能。
三、窗體設(shè)計
啟動VisualStdio2005,新建一個基于C#的“Windows應(yīng)用程序項(xiàng)目”。在自動創(chuàng)建的form1上添加如下控件:
控件類型及數(shù)量作用:
◆button兩個 點(diǎn)擊button1選擇文件夾,點(diǎn)擊button2開始統(tǒng)計
◆textBox一個 供輸入拓展名
◆label1五個 用于靜態(tài)提示的表示
◆listBox一個 顯示最終的分類統(tǒng)計結(jié)果
另外,如果想詳細(xì)的顯示每個統(tǒng)計的源文件的詳細(xì)情況,可以再添加dataGridView控件,利用它對每個文件的名稱、行數(shù)、路徑,進(jìn)行詳細(xì)顯示。篇幅所限,本文略去所有控件的屬性設(shè)置,詳見源程序。
我們可以新建一個Form專門停放dataGridView(更好的顯示效果)。這樣就牽扯到了窗體間如何傳遞codeList集合的問題。提示大家可以用this仿“指針”進(jìn)行傳遞。
本程序只有一個待統(tǒng)計目錄,有興趣的朋友可以考慮:如何設(shè)置多個待統(tǒng)計目錄(多一層foreach)。
另外,采用StreamReader獲取文件行數(shù)的方法再極端大的源碼樣本運(yùn)行時會略顯慢,大家可以考慮采取其它優(yōu)化的辦法,比如:利用統(tǒng)計學(xué)原理找到一個常數(shù)(平均每行字符數(shù)),然后用文件長度處以這個數(shù)以得到行數(shù),當(dāng)然,這樣會降低統(tǒng)計精度。
至此,我們已經(jīng)體驗(yàn)了Visual C#和C#語言特性的強(qiáng)大功能并成功實(shí)現(xiàn)了這一軟件。本程序在Visual C# 2005 WindowsXP SP2下調(diào)試通過。
【編輯推薦】