本文是我前幾天給公司裏面同事培訓C#時的一個講義,今天抽時間進行了下潤色,主要介紹了下我這幾年開發C#應用程序積累的一些經驗。雖然本文圍繞着C#語言展開,但大部分場景一樣也適用於VB.NET的開發。數據庫
一、開發人員的開發環境以框架要求爲準。如統一使用VS2010開發環境與.NET Framework 4.0等。瀏覽器
若是安裝了更高版本的VS開發工具,須要在提交sln文件到SVN前修改標題,不然其餘開發者更新下來sln後,可能會出現沒法用低版本IDE打開的問題。緩存
如用VS2012建立的工程,須要修改sln文件,將Format Version由12.00改成11.00,Visual Studio 2012改成2010。
安全
在程序集屬性中能夠指定編譯目標平臺,以下面指定了目標平臺爲.NET Framework 4.0網絡
二、若是在程序中須要用到指針,需勾選「容許不安全代碼」。通常不要勾選「優化代碼」,這可能致使編譯器在對多線程程序作出錯誤的優化操做。多線程
三、生成事件命令行能夠在程序生成前或生成後執行Windows命令,通常用於將本地的配置文件等複製到生成後的目錄中。架構
客戶端的架構人員通常由項目組中一個專門的人來擔任。這我的須要具有必定C#(或VB.NET)開發經驗。框架
總體客戶端的架構工做包括:異步
一、爲各業務系統創建專門的程序集,簡化各業務系統編碼人員的編碼。工具
二、處理項目開發過程當中的非業務問題,找出問題出現緣由。
三、處理、分配並解決開發過程當中遇到的技術問題,包括提出方案、開發程序、編寫文檔工做。
通信功能是客戶端程序最爲重要的功能之一,通常在客戶端搭建之初,由架構人員統一調試成功並給出通信接口類。全部編碼人員按方法調用便可。
通信功能須要注意的點有:
一、通信分爲同步通信和異步通信,同步通信通常用於處理實時性要求高的接口,大多數接口都使用同步通信。異步通信通常用於提供一些盡力而爲的服務,異步通信也能夠用於實現一些不但願因網絡緣由出現卡頓影響總體效果的功能(如監控)。
二、同步通信的通信超時時間,通常根據程序實際使用場景進行設定。對於一些運行時間可能很是長的接口(如日終時執行批處理任務),能夠酌情加長超時時間。
三、斷線重連機制,須要確保斷線和重連功能,特別是要保證重連後刷新出來的數據在覆蓋老數據時,一些相關處理邏輯的正確性。
四、(這點是對開發人員說的)對於會更改數據庫內數據的接口,一個按鈕最多調用一次。不然會出現下面的狀況:一個按鈕前後執行A、B操做,執行B操做失敗時,A操做沒法回滾。
案例:Long類型數據0的先後臺傳遞
問題描述:
後臺程序用Java語言編寫,前臺程序用C#編寫時。由於Java中的Long類型(不是long類型)數據是能夠爲null的,C#中的long類型數據是不能夠爲null的,後者的默認值是0。如何肯定前臺程序收到的一個long類型變量在後臺是0仍是null?
處理辦法:
在生成值類型接口時,須要將.NET中的值類型數據,寫成兩個屬性,第一個屬性用於存儲這個數據的值,第二個屬性用於標記是否爲null,以下圖所示:
案例:因網速慢的問題致使重複提交
問題描述:
新增操做,第一次點擊提交按鈕時同步鏈接接收超時,但後臺服務實際上已經處理了該問題,只是由於處理速度慢或網速慢致使接口調用時間超過了超時時間。若是數據不具有惟一性約束,第二次點擊「提交」時,會重複提交一條新的數據。
處理辦法:
使用令牌機制能夠解決此問題,即在前臺窗口創建時向後臺申請一個惟一的令牌,第一次調用接口時,覈對令牌,並在後臺令牌庫中標記此令牌已使用。第二次調用時,如第一次調用已經成功,覈對令牌時就會提示異常。
日誌分爲框架日誌和各業務系統日誌,這兩類日誌須要分開存放,各業務系統日誌也須要分開存放,便於往後排查問題。日誌中要說明問題發生的時間、問題等級、問題描述,若是是異常信息,還應提供調用堆棧。
日誌等級通常由各項目本身定義,能夠參考下面的方法分級:
Debug:調試類信息,程序開發階段爲方便開發人員自身調試輸出的信息
Info:日誌類信息,一些開發人員認爲應該打印出來的信息
Warning:警告類信息,不影響流程但又應引發重視的問題,分到警告級別
Error:錯誤類信息,彈出的異常通常分到此等級中
將日誌分級還有一個好處,就是能夠經過配置對程序輸出的日誌進行過濾,如提供給客戶使用的日誌,不打印調試類信息。
一個系統的配置功能,分爲全局配置、客戶端配置和個性化配置三類
一、全局配置,放在後臺管理,全部的客戶端在開啓後都會向後臺請求全局配置。全局配置通常適用於一些可能會出現變動且出現變動後方便平臺統一修改的內容,如電話號碼的正則校驗規則。
二、系統配置,系統配置是每一個客戶端保存一份的配置。通常用於記錄客戶端維度的設置,如上次登陸用戶名、通訊配置等。
三、個性化配置,客戶端每一個操做員均可以保存一份本身的配置。能夠採用key-value(鍵值對)的形式進行存儲。
以下圖就是一個個性化配置的配置文件:
編碼規範決定了一個小組是否能夠編寫出風格相近的代碼。通常推出編碼規範的執行力受團隊的默契程度和開發人員的經驗影響。
一、基本編碼規範
基本編碼規範是編碼的底線,全部編碼人員必須無條件遵照,如標識符的命名規則(控件、接口命名使用匈牙利命名法)、文檔首部註釋規則(說明開發人員、建立日期等內容)。基本編碼規範同時也是代碼審查時候的一個依據。
二、項目編碼規範
項目編碼規範,是適用於當前項目的臨時性編碼規範,好比工具類的調用方法及調用順序等,須要各個項目組寫入文檔。
三、C#編碼風格與Java編碼風格的區別(舉兩個例子)
C#的大括號寫在下面,Java的大括號寫在後面
C#的方法名首字母大寫,Java的方法名首字母小寫
四、在「調試」菜單下的「選項和設置」中能夠設置編碼風格
編碼過程當中,會遇到各類各樣的程序缺陷。程序缺陷大體分爲三類:
一、開發環境固有缺陷
這類缺陷不少都是操做系統缺陷,只能設法繞過,或是想其餘方法解決。這類缺陷解決時,不能只侷限於百度搜索,要學會使用英文在一些國外技術網站(如MSDN論壇、StackOverflow等)上搜索答案。
說一下我遇到的兩個C#的控件問題及解決方案:
TreeView控件複選框聯動時鼠標點擊過快致使的顯示不正確的問題
http://my.oschina.net/Tsybius2014/blog/551358
ListView使用數據分組功能(ListViewGroup)後,點擊組標題,爲組內數據賦的顏色就會褪爲黑色
http://my.oschina.net/Tsybius2014/blog/610051 (第二節)
二、二次開發缺陷
若是你使用的是公司研發部門提供的框架,或是使用了從其餘商業機構購買的內容,與之有關的問題均可以求助相關技術部門。通常來講,較新的框架問題也較多。另外,儘可能不要使用已經沒有人維護的框架和庫。
三、自身缺陷
記住,你自身犯錯誤的概率遠比上面兩個地方出現錯誤的概率大!減小自身缺陷的方法,就是要多作自測,多積累編碼經驗,出現問題多從本身身上找緣由。代碼審查也能夠在很大程度上消滅代碼中缺陷,巴菲特曾說,「與其從本身身上吸收教訓,不如從其餘人的錯誤中吸收教訓」,開發人員間常常交流、相互之間多作一些代碼審查,每每可讓他們的開發水平快速成長。
下面說一說客戶端架構中一些功能的編碼要點
一、自動鎖屏
自動鎖屏須要創建鉤子監控鼠標移動、鼠標點擊、鍵盤按鍵三類事件,監控事件在客戶端打開時註冊,在客戶端關閉前必定要註銷。不然在關閉時觸發可能引發客戶端的崩潰。
二、自動刷新
自動刷新功能有多種實現方式,各有利弊。使用Timer組件實現的自動刷新,簡便易用。也可使用多線程本身實現自動刷新,但新手操做多線程可能會有死鎖、訪問已釋放資源等風險。
三、自定義控件、組件
不少時候,自定義控件、組件能夠減小重複工做量。對於不一樣頁面都須要重複添加的小功能,使用自定義控件、組件實現它們很是合適。好比DataGridView窗格控件中,實現一個列類型,在輸入值爲單位爲Byte的數字後,會在顯示內容時自動將其轉換爲XXXKB、XXXMB等,不少個DataGridView均可能須要這個功能,但咱們只實現一次就夠了。
舉幾個我寫的自定義控件的例子:
基於三個ListView的名單比較控件:http://my.oschina.net/Tsybius2014/blog/610051
基於LinkedLabel的超連接控件:http://my.oschina.net/Tsybius2014/blog/549291
四、內置瀏覽器
若是要在C#客戶端內使用瀏覽器,要特別當心,由於兼容性問題很是多。微軟提供的WebBrowser控件默認使用的內核配置在註冊表中,通常Win7系統這個配置都是IE7(即便你電腦上的IE是更高版本如IE8)。使用其餘瀏覽器內核開發客戶端,也須要注意多瀏覽器兼容、緩存刷新等問題。
五、反射、特性等高級語言功能
反射(Reflection)、特性(Attribute)這類高級語言在架構設計中起着很是重要的做用。特性功能相似Java語言的註解。
客戶端出包是一個比較重要的環節。
我開發過一個工具用於給程序自動打包,其打包步驟以下:
一、讀取打包工具的配置項(如rar.exe、makensisw.exe地址等)
二、刪除全部pdb文件
三、複製一份用於自動更新包的副本,刪除配置文件等可能會隨着用戶使用不斷更新的文件
四、打開NSIS程序,編譯nsi腳本爲程序製做安裝包
五、使用WinRAR將程序安裝包 、自動更新內容製做到壓縮包中,打包完畢
須要注意的是:
一、打包前要先刪除冗餘文件,如*.pdb文件。對於自動更新端,還要刪除那些可能會隨着每次登陸發生改變的文件和目錄(如本地緩存數據用的文件等)
二、WinRAR程序(rar.exe)和NSIS編譯工具(makensisw.exe)都提供了功能強大的命令,能夠利用這些命令完成不少自動化操做內容
①、防止開發過程當中的SVN衝突
前臺C#客戶端中的SLN和CSPROJ文件,在知足條件後應當即更新到SVN
Q:何時須要提交 *.SLN 文件?
A:如下狀況下需當即更新SLN文件
1)修改解決方案屬性(如設置啓動項目等),應當即更新SLN文件
2)新增、刪除解決方案中的程序集後,應當即更新SLN文件
Q:何時須要提交 *.CSPROJ 文件?
A:如下狀況下需當即更新CSPROJ文件
1)修改程序集屬性(如設置版本號,設置生成事件命令行等),應當即更新CSPROJ文件
2)添加類、窗體或其餘文件到程序集下,不管使用任何方法(添加現有項或手工拖入),都須要先將文件ADD到SVN,而後當即更新CSPROJ文件
3)刪除某一個程序集下的文件,須要先在解決方案中刪除這個文件,再在對應目錄上從SVN更新下來這個文件,在SVN上DELETE掉該文件,最後提交CSPROJ文件
4)上傳、刪除資源文件(Resource)後,應當即更新CSPROJ文件
解決文件更新衝突的辦法:
1)同一子系統中,COMMIT完畢後當即通知其餘人UPDATE
2)對於他人未提交解決方案或程序集信息的狀況,若是在工做時間或當事人在場,溝通解決,不然從速解決
3)若是已經存在衝突,則協商解決
另外須要注意的是:上傳文件前本身要先編譯經過,對於吃不許的狀況,能夠本身創建一個新文件夾CHECKOUT下來一份試着編譯一下
②、編寫好一個界面後,記得設定該界面的Tab鍵順序
修改Tab鍵順序的辦法爲:
一、進入該頁面的設計器界面
二、在VS的【視圖】菜單下找到【Tab鍵順序(B)】
三、按順序依次點擊各個須要獲取焦點的控件
四、在VS的【視圖】菜單下找到【Tab鍵順序(B)】,再按一次該按鈕退出編輯Tab鍵順序狀態
主要須要設置Tab鍵順序的地方:
一、有不少輸入項須要用戶輸入的窗口,各輸入框須要設置Tab鍵順序
二、帶有查詢條件的查詢窗口,查詢條件須要設置Tab鍵順序
③、表單的導入和導出
以Excel文件爲例:
表單的導入能夠看作是一個文件上傳加上後臺解析的過程。在進行文件解析時,需注意除提供對 MS Office的支持外,不少機構要求對WPS也提供支持。另一點就是須要對Office2007以前和以後的Excel進行分類討論,由於xls和xlsx的解析機制是不同的。
表單的導出分爲前臺導出和後臺導出,前臺導出是經過前臺程序直接調用Office類庫(或其餘類庫,下同),後臺導出的即由後臺生成文件,經過文件下載的方式傳遞到前臺進行導出。通常推薦使用後臺導出,由於這樣能夠避免因用戶環境問題引起的導出失敗。
④、C#與其餘語言的交互
C#語言和VB.NET語言是相通的,C#能夠很容易地使用VB.NET語言編譯出的DLL。
C#語言與非託管的C++代碼編譯出的DLL庫也能夠相互調用,不過要事先在程序中對這個DLL進行聲明。
END