一些可能有點用處的C#開發經驗


前言:

下個月就要去進行Java開發了,以后C#碰的就少了(可惜去年買了三本C#的書,幾乎還是全新的……),平時一些經驗都記在OneNote里面,現在收集整理出來,因為只能利用交接工作的打醬油的時間,暫時沒什么排版,陸續更新中……

 

里面的經驗基本上都是比較初級的,是在進行開發工作中很可能遇到的問題~很多都是個人總結,搜集,肯定有些不合理甚至錯誤的東西,望不吝指正。

 

2015年4月1日17:52:17

基本更新完成,還有部分內容記載具體的項目經驗中,還需要篩選下……

 

C#篇:

1、目標平台的選擇

64位操作系統在編譯VS里的程序時,根據需要設置項目屬性的“目標平台”為x86。如果設置為AnyCPU,則在VS 2005里面是不能“編輯並繼續”的。

——在選擇x86和AnyCPU都可以在32位操作系統上使用。

——選擇x86在64位服務器上運行,可能會造成類庫無法加載的問題。此問題在后文IIS經驗中解釋。

 

2、取DataTable或者DataGridView里面值的兩種常用方法:

dt.Rows[i].Cells["ID"].Value.ToString();
dt.Rows[0]["Name"].ToString();

前者需要從Value中取值,使用起來不是太方便。后者且不能加Value

——所有的中括號中都可以使用序號(從0開始)或是字段名(列名、行名)

 

3、如果沒有使用Linq(一直都用的2.0框架……),可以使用此法來寫執行SQL。如:

string strSQL = string.Format("Insert table_1 values('{0}', '{1}',{2},{3})"

如果是varchar類型,必須使用'';如果是int,目前發現既可使用''也可以不使用,往往寫腳本,嫌麻煩,就都帶上了'',貌似執行上不會有問題,但不知道性能會不會有所下降。如果有知道的朋友請在評論區說下咯。

——有朋友評論說這個容易被注入式攻擊。查了下避免注入式攻擊的方法:1、使用存儲過程;2、參數化SQL語句。

——以下是使用參數化SQL語句的方式:

 

SqlCommand command = new SqlCommand("select * from UserInfo where sex=@sex and age>@age", connection); 
SqlParameter parameter = new SqlParameter("@age", SqlDbType.Int);//注意UserInfo表里age字段是int類型的 
parameter.Value = 30; 
command.Parameters.Add(parameter);//添加參數 
SqlDataAdapter adapter = new SqlDataAdapter(command); 

 

4、DLL引用了,但是在代碼里面還是無法調用。

嘗試在DLL的屬性里面設置使用特定版本為False

 

5、類庫里的方法在調用的時候,如何讓方法上面顯示自定義說明?

勾選一下項目:屬性——生成——XML文檔文件

——使用類庫的時候,把對應的XML也拷貝的相同目錄,這樣會在VS中看到類庫函數的自定義說明。前提是代碼里面使用“///”生成注釋。

 

 

6、博友分享:VS2010在新建.net 4.0項目時,經常會默認一個Clent Profile的東東,經常出現問題。。。切換為標准框架即可。

VS2005不存在這個問題,VS2013好像也不存在這個問題。

 

7、未能加載程序集

這個問題的范疇過於龐大,能夠造成這方面問題的原因可能有很多,我記得比較分散,后面找到了陸續補充。

(1)版本不匹配。

(2)類庫生成x86還是x64還是AnyCPU,最好能夠做到目標平台保持一致。

(3)兩個項目引用路徑不同,或生成個路徑不同。

 

8、***.dll標記為系統必備,必須對其進行強簽名。

(1)首先,參考這個地方。http://blog.csdn.net/qiujiahao/article/details/2775262;

(2)其次,出現這個問題,很有可能是因為兩個項目調用了相同的DLL,但是兩個DLL版本不同,需要使這兩個版本相同即可。

 

9、如何把Console程序修改為WinForm程序。

(1)修改Program.cs,按照Winform程序的方式來修改即可。

(2)修改應用程序的屬性,在應用程序——輸出類型中修改為Windows應用程序。

 

10、DataGridView在使用其單擊、雙擊事件時,如果需要使用RowIndex,需要判斷其是否小於0(表頭),否則會報錯。

11、當多個窗體都設置了TopMost,則只有最先設置的窗體在頂層。

12、引用了DLL,但是編譯的時候還是提示沒有找到命名空間。

背景:這個問題很坑,很難發現問題所在。如一個解決方案中有項目A,生成類庫,testA.dll;還有項目B,生成類庫,testB.dll。如果項目B的程序集名稱和默認命名空間設置成了testA,則編譯不會報錯,但是你這時候想調用testB中的方法時,會發現根本找不到,全是testA的方法!

解決辦法:右鍵查看項目(也有可能是相關項目)的程序集名稱和默認命名空間。是否與類庫名稱一致。

13、如何修改VS2008轉化后的項目為2005版。

如上圖:修改第一行Format Version 9.00.修改第二行為Visual Studio 2005。

14、DataGridView時間格式設置

dataGridView1.Columns[n].DefaultCellStyle.Format = "yyyy-MM-dd";

15、當前不會命中斷點。源代碼與原始版本不同問題的解決方法

坑到爆的問題來了……這個問題出現大多是因為混亂的項目引用。以下提供幾個可能有用的解決方案:

方案一:在VS菜單的生成中,選擇“清理解決方案”,然后重新生成解決方案。

方案二:實際上有比這個辦法更好的辦法,就是將出問題的文件用notepad打開,然后另存為Unicode編碼,覆蓋原來的文件。

方案三:通過重新格式化出問題的源文件亦可以解決,即在VS2005中選擇 “編輯”——〉“高級”——〉“設置選定內容的格式”。

以上三個方案參考自:http://blog.csdn.net/zztoll/article/details/6688949

實際上我都用了,沒用!

最后解決辦法的:

根據分析,以及這篇文章的內容,出現此問題是因為我直接引用了DLL,而不是直接引用項目。DLL還未重新編譯的時候,直接運行了程序,則造成DLL內容還沒有更新,調試無法運行到斷點。

16、float doubledecimal的區別

#region

float 單精度浮點 32bit

double 雙精度浮點64bit,

decimal是高精度 128bit,浮點型。

float double 是 基本類型(primitive type),decimal不是。

float 有效數字7位,范圍  ±1.5 × 10E45 to ±3.4 × 10E38

double 有效數字15/16 位,范圍 ±5.0 × 10 E−324 to ±1.7 × 10E308

decimal 有效數字 28/29 位,范圍 ±1.0 × 10E−28 to ±7.9 × 10E28( E -- 下接幾次方) 

decimal的有效位數很大,達到了128位,但是表示的數據范圍卻比floatdouble類型小。

使用的時候會對計算時的性能有影響。

常數寫法:

float f = 12.3F;  (帶F)

double x=12.3;  (不帶就是double)

decimal d = 12.30M; (帶M)

 

浮點數運算會有精度損失問題,有精度損失時程序不會報告,要程序員自己注意。

#endregion

17、如何清空StringBuilder

 

 1、Remove例:           

StringBuilder val = new StringBuilder();           

val.Append("....");           

val.Remove(0,val.Length);//清空

 

2、Replace          

 StringBuilder val = new StringBuilder();          

 val.Append("....");          

 val.Replace(val.ToString(), "");//清空

 

3、Length            

StringBuilder val = new StringBuilder();           

val.Append("....");           

val.Length = 0;//清空經過測試第三種效率更高,推薦用第三種!

 

 

SQL篇

1、有關SQL中Join的問題。

left join的那個表(子表),on的字段存在兩條,那么查詢出來的結果會分為兩條。

——所以對於子表內容掌控不准確,很可能會查詢出不符合需求的結果。

例子:

(1)兩個表的內容是

(2)left join的結果

 

2、同一張表可以Left Join兩次

——比如主表A為大掃除任務安排表,其中包含“掃地的學生ID”,“倒垃圾的學生ID”,可以通過兩次關聯學生信息表B,來在主表中查詢出學生姓名。

——以下例子與上面的舉例無關。僅供參考。

 

3、Union的時候,如果對應的兩個字段類型不同,必須進行轉換,否則會出錯。

如上圖convert。注意使用union all可以顯著提高速度,這樣的話,不會對查詢結果進行排序。

 

4、SQL Server中鏈接服務器的使用方法

應用背景:應用軟件包含多個數據庫服務器,但是某個查詢需要從兩個數據庫服務器的數據庫中查詢數據的。

使用說明:

(1)添加一個鏈接服務器。

exec sp_addlinkedserver @server='serverontest',@provider='sqloledb',@srvproduct='',@datasrc='101.123.10.112'

(2)添加登錄方式

EXEC sp_addlinkedsrvlogin @rmtsrvname = 'serverontest', @useself = 'false', @locallogin = 'sa', @rmtuser = 'sa', @rmtpassword = 'passwordofsa'

(3)以上兩個語句中,@server為服務器的別名,@datasrc為要鏈接的目標數據庫的連接串,@rmtsrvname為別名,@locallogin為本地登錄的用戶名,@rmtuser@rmtpassword為要鏈接的目標數據庫的登錄用戶名和密碼。

(4)添加完鏈接服務器之后,可以通過select * from sys.linked_logins select * from sys.servers來查看已經添加的鏈接服務器和登錄角色。

(5)添加完鏈接服務器后,使用select * from 別名.庫名.dbo.表名 來對其中的數據進行查詢。

(6)刪除鏈接服務器登錄映射和鏈接服務器的方法:

  exec sp_droplinkedsrvlogin ’serverontest’ ,’sa’ 

  exec sp_dropserver ’serverontest’

 

思想以及設計理念:

1、邏輯刪除與物理刪除的概念?

物理刪除時真正的刪除了,邏輯刪除還保留數據在數據庫中的位置,但是修改其刪除標志為已刪除狀態(貌似這個在大學里面就學了……)

 

2、在UI層(用戶操作界面),如果出錯了,或者操作失敗了,應該提醒用戶下一步應該做什么。

如:當用戶進行操作B的時候,需要先開啟選項A。設當前選項A為關閉狀態,用戶進行操作B,此時應提示:“操作失敗,選項A未啟用,請到XXX設置中開啟選項A”。在某些應用中,甚至可以增加直接跳轉到設置的地方,或者直接修改設置。根據需要而定。

——提醒用戶改做什么,個人認為是應該的,體現友好度。但是不應該把代碼中具體的異常暴露出來,具體異常應該記錄日志,並使用異常編碼,在文檔中、代碼中管理起來。

 

3、當可以確定兩份程序完全一致,但是怎么運行結果都不一致,先檢查配置文件是否不同。

 

4、如何查看進程的端口號。

命令行輸入:netstat -ano

5、如何使用命令行安裝Windows服務

%SystemRoot%\Microsoft.NET\Framework\v2.0.50727\installutil.exe E:\myService\ServiceTest.exe

Net Start ServiceTest

sc config ServiceTest start= auto

前提是,你所要安裝的服務,所在路徑不能包含空格。如常見的Program Files,就會造成安裝失敗。

如果安裝的時候,命令行窗口一閃而過沒有看到什么情況,可以自行在命令提示符里面執行以上的腳本以查看報錯。或者在結尾加上pause

 

PS:一個一直支撐我的寶貴經驗:

哈佛有一個著名的理論:人的差別在於業余時間,而一個人的命運決定於晚上8點到10點之間。每晚抽出2個小時的時間用來閱讀、進修、思考或參加有意的演講、討論,你會發現,你的人生正在發生改變,堅持數年之后,成功會向你招手。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM