[畢業生的商業軟件開發之路]C#進階建議
------------------------------------------------------------
C#進階建議
由于一些讀者已經掌握了其他編程語言的技術,在此對此類讀者提供一些C#進階建議,希望能幫助這類讀者更好的掌握C#語言。
從VB到C#
筆者就是從VB6.0轉變到C#的,在此提出一些VB轉變到C#的建議,希望能給那些已經掌握VB的讀者一些幫助。
C#的語法采用C語言樣式,而且其設計大量參考了VB的思想。其轉變要點如下:
●VB的變量、方法和類型的名稱是不區分大小寫的,而C#是區分大小寫的。
●VB的語句是使用換行來確定的,而C#是用過雙引號“;”來分隔語法單位的。
●VB進行復合條件判斷時,是所有的條件項目都會執行判斷,而C#是依次執行的,若遇到確定情況則立即結束判斷。
例如在VB中執行語句“if value1 <> 0 or value2 = 2 then”,若判斷出“value1 <> 0”成立后,按理來說無論第二個條件是否成立,這個復合條件都是成立的,但在VB中程序還是會計算“valu2 = 2”是否成立,當所有的條件項目判斷完畢后才得出整個復合判斷條件是否成立。
而在C#中執行等價的語句“if( value != 0 or value2 == 2 )”,若判斷出“value1 != 0 ”成立,則程序認定這個復合判斷條件成立,不再計算出“value2 == 2”的判斷條件。
從這個過程可以看出,C#在執行復合條件判斷時比VB效率高。
●foreach語句。
C#支持VB中foreach語句, VB中的寫法是“foreach 變量名 in 列表變量名”,而C#的寫法是“foreach( 類型名稱 變量名 in 列表變量名)”。
例如有一個整數數組,在VB中遍歷數據組的寫法是
Dim item as Integer
For Each item in Array
Next
而C#的寫法是
foreach( int item in array )
{
}
●數組下標。
VB的數組下標默認是從1開始計算的,而C#是從0開始計算的;VB的UBound函數返回的是可用下標的最大值,而C#的數組對象的Length或者Count屬性返回的是數組中元素的個數,此時可用下標的最大值是要減去1的。
例如在VB使用語句“Dim Array(10) As Integer”定義一個數組,則它的元素個數是10,最小下標是1,最大下標是10。
而在C#中使用語句“int[] Array = new int[10]”定義的數組,它的元素個數是10,最小下標是0,最大下標是9,而它的Length屬性值為10。
在VB中對于數組下標時,下標值兩邊是園括號,但在C#中使用方括號。例如VB代碼“Array(9)”就是獲得數組中第9個元素的數值,而在C#中就必須寫成“Array[9]”。
●參數傳遞方式。
C#和VB在函數參數的傳遞時都有按值傳遞和按引用傳遞的區分。VB的函數參數值默認是按引用傳遞的,而C#的函數參數值默認是按值傳遞的。
例如使用VB語句“Function F1( arg as Integer )”定義的函數,等價于“Function F1( ByRef arg as Integer)”,當函數體內部修改了參數值,跳出函數后該值也發生了改變。
arg = 10
end Function
此時語句“Function F1( arg as Integer)”等價于“Function F1( byRef arg as Integer )”,若執行了以下VB代碼
Val = 20
F1( Val )
‘執行到這里, Val變量值在函數體內部被修改為10了。
由于在VB中默認按引用傳遞容易留下難于察覺的錯誤,因此寫VB代碼的時候都顯式的寫出ByVal或ByRef的參數傳遞方式。
但是在C#,默認是按照值傳遞的。例如對于以下C#代碼
{
arg = 10 ;
}
若執行了以下C#代碼
F1( Val )
// 執行到這里,Val變量值還是20。
在C#中,若要按引用傳遞則需要使用關鍵字“ref”來修改參數,即寫成類似“void F1( ref int arg)”的代碼。這樣函數體內部修改參數值,函數外部就獲得修改后的參數值了。
C#提供了“out”關鍵字來參數的傳遞方式提供更精細的方式,也就是寫成類似“void F1( out int arg)”的代碼。標記了“out”的關鍵字說明該參數按引用傳遞,而且函數體內部必須修改該參數值,否則編譯錯誤。這也算是非正常的函數返回值吧。
對于類類型,VB和C#都是按引用傳遞的。
●函數調用方式。
VB調用方法是就是直接寫函數名,后面跟著參數,參數不用括號分開,比如定義了函數“Function F1( byval a as Integer , byval b as Integer )”,則調用該函數的代碼通常為“F1 10 , 20”,少數情況也可以寫成“Call F1( 10 , 20 )”。但對于C#必須在參數兩邊寫上園括號的,因此必須寫成“F1( 10 , 20 )”。
●異常處理。
VB中可以使用“on error goto”或“on error resume”來處理異常,并支持使用“resume”語句來跳回到發生異常的代碼處。但C#不支持類似“on error resume”語句的功能,也不支持“resume”進行代碼跳轉。
從C/C++到C#
筆者對C/C++語言也是略懂略懂,因此在此提出一些從C/C++語言轉變到C#語言的一些參考建議,希望能對那些已經掌握了C/C++語言的讀者提供些幫助。其要點如下:
●指針。
C語言最大強大的功能就是指針。C#也支持指針,但已經不推薦使用了,從而使指針成為很高級的C#語法了。
在C#語言中要使用指針,首先得使用語法結構“unsafe{ }”創建一個代碼塊,在這個代碼塊中才能使用指針。
定義指針變量時,C#中“*”必須和基礎類型在一起使用,否則編譯錯誤,比如代碼“int* p1 , p2 , p3”在C#中定義了3個指向整數類型的指針變量;而代碼“int *p1 , *p2 , *p3;”在C#中是會發生編譯錯誤的,而在C語言中是正確的。
C#不允許不同指針類型之間或者指針類型與整數之間的轉換,而C語言只允許的。比如代碼
char*p2;
p1 = p2;
這段代碼在C#中是錯誤的,而在C語言中是可以的。
●安全性。
C#提供了比C/C++更為嚴格的安全性。比如C/C++不檢查數組下標是否越界,而C#會嚴格檢查的。.NET框架提供了可信運行環境,在此上面運行的所有的程序都要受到限制,包括C#。
●條件編譯。
C#也支持類似C語言的條件編譯功能,支持“#define”、“#undefine”、“#if”等指令。但不支持C樣式的宏,包括宏常量和帶參數的宏,也不支持“#include”指令。
●訪問類型成員。
在C++中使用“->”訪問類型成員,而在C#中直接使用一個字符點“.”來訪問類型成員。
●函數。
在C/C++中,函數是可以獨立編寫的,不屬于任何類型,比如Main函數。但在C#中沒有游離的函數,所有的函數必須屬于某個類型,包括Main函數。
●字符串定義。
在C/C++中使用雙引號定義一個字符串量,并且使用斜杠字符“\”進行轉義,C#也支持,不過還提供一種定義多行字符串的方法,也就是在雙引號前面加上“@”符號。例如以下C#代碼定義了一個多行字符串。
1234 \t
5678”;
在C#定義的多行字符串時,斜杠轉義是無效的。
特別的,在傳統的C/C++中,字符串是以“\0”作為字符串的結束標志的,而在C#中字符串對象可以包含“\0”的,這點在兩者之間傳遞字符串數據時需要注意。
●繼承。
在C++中,一個類可以繼承多個其他類,可以實現多個接口;而在C#中一個類只能繼承一個其他的類,也可以實現多個接口。
●注釋。
C/C++支持雙斜杠字符“//”定義單行注釋,使用斜杠和星號對“/* */”實現多行注釋,C#也支持這種方式。
不過C#更進一步,在成員或者函數前面使用連續的三個斜杠“///”和特定的XML語法實現文檔化的注釋,C#編譯器能提取出代碼中的文檔化的注釋并自動生成相關SDK幫助文檔。
從JAVA到C#
筆者對JAVA語法也是略懂略懂,真的只是略懂哦?,F在以個人對JAVA語法的一點理解來提出從JAVA轉到C#的建議,希望能對已經掌握了JAVA語法的讀者有所幫助。
●JAVA和C#語法確實非常像,代碼組織結構也很類似,雙方都有相對應的關鍵字。
●C#支持委托,而JAVA不支持。C#中的委托可以說是C語言的函數指針的OOP版本,它是一種變量,能存儲某個函數的入口點地址,因此委托可以增強C#語言的靈活性,而JAVA不支持這種特性。
●C#支持事件,而JAVA不支持。C#在委托的支持下支持事件,一個事件上可以綁定多個委托來支持廣播;而且JAVA需要通過實現接口的方式來模擬實現事件機制,這方面操作起來不大方便。
posted on 2011-08-11 09:39 袁永福 電子病歷,醫療信息化 閱讀(1386) 評論(0) 收藏 舉報
浙公網安備 33010602011771號