[畢業生的商業軟件開發之路]C#表達式以及判斷語法結構
近期開始接觸到在校學生、高校實習生和畢業生,在此說一下筆者對這些徘徊在職場門口的學生一些建議,希望能給這些初學者進入軟件開發行業帶來一些幫助,使得畢業生能更順利的進入軟件開發公司開始職場生涯,人生來一個完美的轉彎。
-------------------------------------------------------------------------------------
表達式
數學表達式
C#的數學表達式支持加、減、乘、除和求模運算,這個和其他編程語言差不多。其支持的運算符如下表所示
|
+ |
加,例如“2 + 3”,運算結果為5。 |
|
- |
減,例如“2-3”,運算結果為-1。 |
|
* |
乘,例如“2*3”,運算結果為6。 |
|
/ |
除,例如“2/3”,運算結果為“0.66666”。 |
|
% |
求模,例如“2%3”,運算結果為“2”。 |
|
++ |
自增1,例如“int a = 2 ; a ++ ”,運算結果為“3”。 |
|
-- |
自減1,例如“int a = 2 ; a--”,運算結果為“1”。 |
C#支持使用園括號來改變運算的優先級。
邏輯表達式
C#支持的邏輯表達式,和其他編程語言差不多,其支持的運算符如下表所示
|
意義 |
優先級 |
語法 |
|
邏輯反 |
高 |
! |
|
等于 |
中 |
== (兩個等于號,中間不能有空格) |
|
大于 |
中 |
> |
|
大于等于 |
中 |
>= |
|
小于 |
中 |
< |
|
小于等于 |
中 |
<= |
|
不等于 |
中 |
!= |
|
邏輯與 |
低 |
&& |
|
邏輯或 |
低 |
|| |
|
&& |
邏輯與,比如“BooleanValue1 && BooleanValue2”,只有兩個條件都成立,這個表達式才成立。 |
|
|| |
邏輯或,比如“BooleanValue1 || BooleanValue2”,兩個條件中任意一個成立,則這個表達式就會成立。 |
|
! |
邏輯反,比如“! BooleanValue”,若條件成立,則表達式不成立,若條件不成立,則表達式成立。 |
C#支持使用園括號來改變運算的優先級。
位運算表達式
C#支持類似C語言的位運算。
|
<< |
左位移,相當于乘以2的若干次方。比如“int a = 3 ; a <<2”其效果等于“a = a * 2 * 2”,運算結果為12 ;但左位移操作比乘法操作要快得多,若固定為乘上2的若干次方值時,盡量用左位移操作。 |
|
>> |
右位移,相當于除以2的若干次方,比如“int a = 100 ; a >>2”,其效果等于“a = a / 4”,運算結果為25;但右位移操作比除法操作要快得多,若固定為除以2的若干次方值時,盡量用右位移操作。 |
|
& |
位與操作。 |
|
| |
位或操作。 |
執行結構
C#采用的是類似C、JAVA語言的執行結構,主要有。
順序執行
條件判斷
在C#中有多種條件判斷執行語句,主要有
if 結構
C#支持if條件判斷結構,使用很簡單,其演示代碼如下
|
DateTime dtm = DateTime.Now; string b = null; if (dtm.Hour >= 12) { b = "下午"; } else { b = "上午"; } |
理論上這段代碼中的花括弧去掉,可以寫成如下,
|
DateTime dtm = DateTime.Now; string b = null; if (dtm.Hour >= 12) b = "下午"; else b = "上午"; |
注意,在實踐中是不推薦這種寫法的,這種寫法雖然比較簡練些,但很可能制造出難于察覺的程序錯誤,還是必須老老實實的把花括號寫出來。
在書寫if語句時,若邏輯表達式是復合的,包含了多個條件,則需要進換行。例如對于以下的代碼,if語句中包含了一個具有4個成員的復合邏輯表達式
|
int NumberValue = 10; string StringValue = "123"; char CharValue = 'z'; double DoubleValue = 30;
if ( NumberValue == 10 || StringValue == "123" || CharValue == 'z' || DoubleValue >= 20 ) { Console.WriteLine("條件成立"); } |
這不寫法不美觀,一條語句過長,推薦寫成如下樣式
|
int NumberValue = 10; string StringValue = "123"; char CharValue = 'z'; double DoubleValue = 30;
if ( NumberValue == 10 || StringValue == "123" || CharValue == 'z' || DoubleValue >= 20 ) { Console.WriteLine("條件成立"); } |
另外如果判斷條件就是一個布爾值,理論上可以寫成如下代碼
|
bool BooleanValue = true; if ( BooleanValue ) { Console.WriteLine("條件成立"); } |
但在實踐中,還是推薦寫成如下代碼
|
bool BooleanValue = true; if ( BooleanValue == true ) { Console.WriteLine("條件成立"); } |
雖然上一種寫法比較簡短,但第二種寫法的可讀性更好。
類似的,當判斷這個布爾值是否為false時,可以使用邏輯反運算符,其代碼如下
|
bool BooleanValue = true; if ( ! BooleanValue ) { Console.WriteLine("條件成立"); } |
這種寫法的可讀性也不好,因為人們在快速的閱讀代碼中有可能將這個“!”字符漏掉,因此在實踐中,還是推薦寫成如下代碼
|
bool BooleanValue = true; if ( BooleanValue == false ) { Console.WriteLine("條件成立"); } |
在實際編寫代碼中,代碼的可讀性比簡短要重要,優先考慮。筆者反對編寫簡短隱晦的代碼來炫耀技術,那跟孔乙己說“茴”字有4種寫法一樣不切實際。
三元運算符
C#中的三元運算符代碼結構為“ 判斷條件 ? 當判斷成立時的值 : 當判斷不成立時的值 ”,例如以下代碼演示了三元運算符
|
DateTime dtm = DateTime.Now; string b = dtm.Hour >= 12 ? "下午" : "上午"; |
在這段代碼中,若當前時間的小時數大于等于12,則獲得數值“下午”,否則獲得數值“上午”。
這種三元運算符功能和if-else語句一樣,不過能更為簡短的方式實現功能。在很多情況下能減少代碼量,提高代碼的可讀性。不過三元運算符沒有什么擴展性,一次只能設置一個變量值。
switch 結構
在C#中使用“if ( 判斷條件 ) 執行代碼 ; else 執行代碼”,比如以下代碼說明了作息狀態
|
DateTime dtm = DateTime.Now; string state = null; switch (dtm.Hour) { case 6: { state = "起床"; } break; case 8: { state = "吃早飯"; } break; case 9: { state = "上班"; } break; case 12: { state = "吃午飯"; } break; case 13: { state = "上班"; } break; case 18: { state = "下班"; } break; case 22: { state = "睡覺"; } break; } Console.WriteLine(state); |
其中的 switch語句塊還可以寫成如下的緊湊樣式
|
switch (dtm.Hour) { case 6: state = "起床"; break; case 8: state = "吃早飯"; break; case 9: state = "上班"; break; case 12: state = "吃午飯"; break; case 13: state = "上班"; break; case 18: state = "下班"; break; case 22: state = "睡覺"; break; } |
若使用if-else結構寫出這種語句,則可以寫成如下
|
DateTime dtm = DateTime.Now; string state = null; if (dtm.Hour == 6) { state = "起床"; } else if (dtm.Hour == 8) { state = "吃早飯"; } else if (dtm.Hour == 9) { state = "上班"; } else if (dtm.Hour == 12) { state = "吃午飯"; } else if (dtm.Hour == 13) { state = "上班"; } else if (dtm.Hour == 18) { state = "下班"; } else if (dtm.Hour == 22) { state = "睡覺"; } Console.WriteLine(state); |
可以看出對于多個常數的比較判斷,使用switch結構還是比較方便的,但在case語句中只能是常數,不能是邏輯表達式,這使得switch結構應用受到不小的限制。
在switch語句塊中可以不使用花括號,因為沒有添加花括號不會導致難于察覺的錯誤,但還是推薦若case-break結構中的功能代碼比較多時還是加花括號。[袁永福版權所有]
在C語言中,case結構如果不加上break關鍵字就可以貫穿執行到下一個case結構,但在C#中,case結構不能貫穿,必須添加break或者return關鍵字來結束case執行塊。
循環結構
在C#中有多種循環結構,以下分別說明
for 循環結構
在C#中,for循環結構寫法為“for( 初始化 ; 邏輯表達式 ; 累加處理 ) { 循環體 }”。例如以下代碼包含了一個for循環結構
|
int count = 0; for (int index = 0; index < 100; index++) { count = count + index; } Console.WriteLine(count.ToString()); |
理論上這段代碼可以寫成如下
|
int count = 0; for (int index = 0; index < 100; index++) count = count + index; Console.WriteLine(count.ToString()); |
|
但筆者推薦還是加上花括號,因為不加花括號很容易導致難于察覺的程序錯誤。
在代碼“for( int index = 0 ; index < 100 ; index ++ )”中,關鍵字“for”說明開始進行了一個循環;“int index = 0”是初始化這個循環,定義了一個累加變量;“index < 100”是這個循環是否執行的邏輯表達式,若判斷成立則執行循環,否則立即退出循環;“index ++ ”是每次執行完一次循環體后執行的代碼,這里是將累加變量自增1。[袁永福版權所有]
上面的for循環執行的步驟如下
|
int count = 0; int index = 0; // 執行第1次循環 if (index < 100) { count = count + index; index++; } else { goto EndFor; } // 執行第2次循環 if (index < 100) { count = count + index; index++; } else { goto EndFor; } // 執行第3次循環 if (index < 100) { count = count + index; index++; } else { goto EndFor; }
// 無窮盡的執行循環體
EndFor: Console.WriteLine(count.ToString( )); |
注意,理論上說循環會無窮盡的執行下去,因此需要設置好退出循環的判斷條件,否則就容易出現死循環,導致死機。
for循環是使用最為靈活的循環結構,在實踐中可以使用它寫成很多精致的代碼。
在各種循環結構中,包括for循環,都可以使用關鍵字continue來跳過一些代碼直接進入下一次循環,使用關鍵字break來立即退出循環。若從套嵌了多層的循環跳出來則可以使用goto語句。
foreach 循環結構
foreach循環結構是一種針對列表類型的循環語法結構,其語法為“foreach( 類型名稱 變量名 in 列表變量名) { 循環體 }”,以下代碼演示了foreach的使用。
|
string[ ] names = new string[100]; foreach (string name in names) { Console.WriteLine(name); } |
在foreach循環中,循環變量是只讀的,不能為它設置值,比如上面的foreach循環體重不能寫上“name = “張三”; ”這樣的代碼,但是for語句是可以的。
foreach循環本質上是C#的一個語法封裝,上述這段代碼等效于如下代碼
|
string[ ] names = new string[100]; System.Collections.IEnumerator enumerator = ((System.Collections.IEnumerable)names).GetEnumerator(); enumerator.Reset(); while (enumerator.MoveNext()) { string name = (string)enumerator.Current; Console.WriteLine(name); } |
因此任何類型只要實現了“System.Collections.IEnumerable”接口的類型就可以用于foreach循環結構。而且這段代碼中“enumerator.Current”是只讀的屬性,這就決定了foreach循環體內不能設置循環變量的值。[袁永福版權所有]
while 循環結構
C#執行while循環結構,其代碼結構為“while( 邏輯表達式 ) { 循環體 }”,例如上節的演示程序
|
string[ ] names = new string[100]; System.Collections.IEnumerator enumerator = ((System.Collections.IEnumerable)names).GetEnumerator(); enumerator.Reset(); while (enumerator.MoveNext()) { string name = (string)enumerator.Current; Console.WriteLine(name); } |
就是一個while循環結構。這個循環等價于執行以下代碼
|
// 執行第一次循環 if (enumerator.MoveNext()) { string name = (string)enumerator.Current; Console.WriteLine(name); } else { goto EndWhile; } // 執行第二次循環 if (enumerator.MoveNext()) { string name = (string)enumerator.Current; Console.WriteLine(name); } else { goto EndWhile; } // 執行第三次循環 if (enumerator.MoveNext()) { string name = (string)enumerator.Current; Console.WriteLine(name); } else { goto EndWhile; } // 無窮盡的執行循環 EndWhile: |
do-while 循環結構
C#支持do-while循環結構,其用法為“do{ 循環體 }while ( 邏輯表達式 ) ;”例如以下代碼演示了do-while循環結構。
|
string[ ] names = new string[100]; int index = 0; do { Console.WriteLine(names[index]); index ++ ; } while (index < names.Length - 1); |
這段代碼相當于執行以下代碼
|
// 執行第一次循環 Console.WriteLine(names[index]); index++; if (! (index < names.Length - 1)) { goto EndDoWhile; } // 執行第二次循環 if (index < names.Length - 1) { Console.WriteLine(names[index]); index++; } else { goto EndDoWhile; } // 執行第三次循環 if (index < names.Length - 1) { Console.WriteLine(names[index]); index++; } else { goto EndDoWhile; } // 無窮盡的執行循環 EndDoWhile: |
從這段代碼可以看出,do-while循環和for、while循環有個不同就是它在執行第一次循環體的前不計算邏輯表達式,讓代碼無保障的運行在高風險區,這就成為一個程序錯誤的高發區。因此筆者很少使用do-while語句,只在某些特殊的情況下才使用。
筆者建議,要寫出穩定健壯的程序,開發人員必須有著很強的風險意識,對意外不得有僥幸心理,認認真真的盡量處理所有可能出現的風險。一個程序應該編寫大量的代碼來維護一個安全的環境,讓功能性的代碼運行得到保障。[袁永福版權所有]
posted on 2011-08-07 09:06 袁永福 電子病歷,醫療信息化 閱讀(1004) 評論(0) 收藏 舉報
浙公網安備 33010602011771號