近期開始接觸到在校學生、高校實習生和畢業生,在此說一下筆者對這些初入職場,徘徊在牛A和牛C之間但就沒找到牛B的學生們一些建議,希望能給這些初學者進入軟體開發行業帶來一些協助,使得畢業生能更順利的進入軟體開發公司開始職場生涯,人生來一個完美的轉彎。
------------------------------------------------------------
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 array(10) as Integer
Dim item as Integer
For Each item in Array
Next
而C#的寫法是
int[] array = new int[10];
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)”,當函數體內部修改了參數值,跳出函數後該值也發生了改變。
Function F1( arg as Integer )
arg = 10
end Function
此時語句“Function F1( arg as Integer)”等價於“Function F1( byRef arg as Integer )”,若執行了以下VB代碼
Dim Val as Integer
Val = 20
F1( Val )
‘執行到這裡, Val變數值在函數體內部被修改為10了。
由於在VB中預設按引用傳遞容易留下難於察覺的錯誤,因此寫VB代碼的時候都顯式的寫出ByVal或ByRef的參數傳遞方式。
但是在C#,預設是按照值傳遞的。例如對於以下C#代碼
void F1( int arg )
{
arg = 10 ;
}
若執行了以下C#代碼
int Val = 20
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語言只允許的。比如代碼
int* p1;
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#代碼定義了一個多行字串。
string myStr = @“abc
1234 \t
5678”;
在C#定義的多行字串時,斜杠轉義是無效的。
特別的,在傳統的C/C++中,字串是以“\0”作為字串的結束標誌的,而在C#中字串對象可以包含“\0”的,這點在兩者之間傳遞字串資料時需要注意。
●繼承。
在C++中,一個類可以繼承多個其他類,可以實現多個介面;而在C#中一個類只能繼承一個其他的類,也可以實現多個介面。
●注釋。
C/C++支援雙斜杠字元“//”定義單行注釋,使用斜杠和星號對“/* */”實現多行注釋,C#也支援這種方式。
不過C#更進一步,在成員或者函數前面使用連續的三個斜杠“///”和特定的XML文法實現文檔化的注釋,C#編譯器能提取出代碼中的文檔化的注釋並自動產生相關SDK協助文檔。
從JAVA到C#
筆者對JAVA文法也是略懂略懂,真的只是略懂哦。現在以個人對JAVA文法的一點理解來提出從JAVA轉到C#的建議,希望能對已經掌握了JAVA文法的讀者有所協助。
●JAVA和C#文法確實非常像,程式碼群組織結構也很類似,雙方都有相對應的關鍵字。
●C#支援委託,而JAVA不支援。C#中的委託可以說是C語言的函數指標的OOP版本,它是一種變數,能儲存某個函數的進入點地址,因此委託可以增強C#語言的靈活性,而JAVA不支援這種特性。
●C#支援事件,而JAVA不支援。C#在委託的支援下支援事件,一個事件上可以綁定多個委託來支援廣播;而且JAVA需要通過實現介面的方式來類比實現事件機制,這方面操作起來不大方便。