C# 基础知识 (二).独特的知识及用法篇
在C#中有一些我自己認為比較獨特的知識點,這些知識點是我經(jīng)常使用的知識,但對它們的了解還是比較少的,所以通過查找資料學習,總結了這些獨特的知識點并簡單敘述,希望對大家有所幫組!其中主要有:var關鍵字、try..catch..finally、foreach語句、ArrayList類、#region..#endregion等知識點。
一.var關鍵字
隱含類型,使用var來聲明任意類型的局部變量。在C#中它僅僅是一個關鍵字,不代表一種新的類型,它僅是負責告訴編譯器:該變量需要根據(jù)初始化表達式來推斷變量的類型,而且只能是局部變量。Var聲明變量后,變量類型就確定下來了,不會在變。例:
var str = “Hello world”; //string類型,相當于 string str = “Hello world”var request = (HttpWebRequest)WebRequest.Create(url); //這是http網(wǎng)絡編程中我使用的例子,var可用HttpWebRequest類型替換二.try..catch..finally
用于處理異常,通常有三中異常處理語句:
(1).try…catch;? ???????????? ?//處理異常
(2).try…finally;? ?????????? ? //清除異常
(3).try…catch…finally;? //處理所有異常
try塊中包含容易產(chǎn)生異常的代碼,使用引發(fā)異常語句,接著捕獲異常;try塊中發(fā)生異常后跳轉到catch異常處理程序,catch用于異常處理程序,通常格式為:catch(異常類 異常對象實例){…}
例1:(參考自《從零開始學C#》)
int [] nums = {1,2,3,4,5,6,7,8,9}; //定義整形數(shù)組 try {for(int i=0;i<=num.Length;i++){Console.Write(num[i].ToString()+” ”);} } catch(Exception ex) {Console.Write(ex.Message.ToString()); //輸入異常錯誤 }Try語句捕獲異常,由于數(shù)組索引從0開始遍歷,用“<=”會遍歷10次,多遍歷一次,出現(xiàn)索引越界,跳轉到catch語句先創(chuàng)建一個異常的對象ex并輸出錯誤信息。運行結果如下圖所示:
finally用于清除產(chǎn)生錯誤分配的資源,在使用try..catch..finally語句中即使引發(fā)異常,finally塊中的代碼也會被執(zhí)行(始終執(zhí)行),從程序中釋放資源。try..catch..finally語句捕獲錯誤、清除并執(zhí)行應用程序,無論有沒有異常都會執(zhí)行,出現(xiàn)異常是執(zhí)行順序為:try->catch->finally;沒有異常執(zhí)行順序為:try->finally。下面看一個實際工程中使用的例子:
例2:(這是我在C#網(wǎng)絡編程中自己編寫的代碼)
try {Stream=response.GetResponseStream(); //獲取應答流… //具體通訊瀏覽器操作 } catch (Exception msg) {MessageBox.Show(msg.Message); //異常處理 } finally {stream.Close(); //釋放資源:關閉流操作 }這是C#瀏覽器中出現(xiàn)異常情況(斷開網(wǎng)絡連接訪問)執(zhí)行結果如下圖所示:
最后注意,處理異常會大大降低性能,所以不要將它用在控制正常程序流程中,如果有可能檢測到代碼中異常,請?zhí)娲鷗ry..catch..finally操作。如在出發(fā)中除數(shù)不能為0這個異常我們可以用if判斷不為0在進行除法操作,這樣就實現(xiàn)了替換。(自定義異常throw這里我就不在介紹了)
三.foreach循環(huán)語句
foreach語句為數(shù)組或對象集合中的每一個元素重復一個嵌入語句組,用于循環(huán)訪問集合以獲取所需信息,需要調(diào)用IEnumerable接口,其格式:foreach(類型變量 in 集合) {?…?//操作}每執(zhí)行一次,循環(huán)變量就依次取集合中的一個元素操作。foreach語句的主要特點是代碼簡潔,效率又高。
例1:(foreach語句簡單迭代)
int [] nums = {1,2,3,4,5,6,7,8,9}; //定義整形數(shù)組 foreach(int i in nums) {Console.WriteLine(i); //循環(huán)輸出數(shù)組 } //相當于:for(int i=0;i<nums.Length;i++) {...}注意:在如上述一維或多維數(shù)組遍歷中,盡量使用foreach語句,他會自動檢查數(shù)組的索引,使其不會出現(xiàn)越界錯誤。而在上面數(shù)組訪問中for循環(huán)語句每執(zhí)行一次都會對數(shù)組索引有效值進行判斷是否越界(相當于使用if-else判斷),foreach會避免這樣情況相對效率較高。同時,如果采用多維數(shù)組操作foreach會更加方便,它只需一層循環(huán),而for語句需要多層循環(huán)來執(zhí)行。
例2:(foreach與for語句多維數(shù)組對比)
int [,] intArray = new int[4,4] {{5,2},{1,2},{3,4}…} foreach(int i in intArray) {Console.WriteLine(i); } //而采用for語句需要兩層循環(huán)執(zhí)行 for(int i=0;i<intArray.GetLength(0);i++)for(int j=0;j<intArray.GetLength(1);j++)Console.WriteLine(intArray[i,j]);下面是foreach語句我在實際項目工程中的一個簡單應用,代碼如下:
例3:(foreach語句在實際工程中的簡單應用)
int count = 0; //記錄選中對象個數(shù) public List<object> aryRects; //存放所有Rectangle對象 public abstract class shape:Object {…} //shape類:屬性protected bool BSelected是否被鼠標選中 foreach(shape s in aryRects) {if (s.BSelected) //如果被選中,count+1{count++;} }這是一個C#編寫畫圖軟件,通過判斷在圖上已經(jīng)被鼠標左鍵選中的圖形的個數(shù)及相應屬性實現(xiàn)移動、刪除等功能。運行結果如下:
顯然,使用for想實現(xiàn)上面的功能是非常困難,甚至無法實現(xiàn)的,這就是foreach的好處及實際工程中的應用。foreach語句需要注意:這里的循環(huán)變量是一個只讀型局部變量,如果嘗試改變其值或刪除會發(fā)生編輯錯誤。
foreach(int I in nums) {i++; //不能修改值Console.WriteLine(i); } //它提示的錯誤信息為:i是一個foreach迭代變量,無法為它賦值 foreach(int I in nums) {nums.Remove(i); //不能刪除值Console.WriteLine(i); }這只是我對foreach的一些簡單認識,其中一些知識點及思想還引用了該文章,這是一篇非常優(yōu)秀的關于foreach語句的文章,感謝原作者和轉載作者:http://blog.csdn.net/huang7914/article/details/2296176
四.ArrayList類
數(shù)組通常大小固定后就不能更改,但C#提供了動態(tài)數(shù)組ArrayList類實現(xiàn)動態(tài)添加、插入或移除元素的方法,更加靈活的設置數(shù)組大小。在使用該類前必須要聲明System.Collections命名空間,ArrayList的屬性和方法如下:
ArrayList類屬性表
(由于使用CSDN插入表格間距太大,不知道怎樣設置行間距,才換成了圖片格式,見諒!)
ArrayList類常用方法表
(上面的兩個表格都轉自孫景瑞的《從零開始學C#》,非常優(yōu)秀的一本書籍,推薦大家看看,同時感謝作者,這里引用了他的知識結晶)
例:
ArrayList aryList = new ArrayList(); for(int i=0;i<4;i++) {aryList.Add(i); //使用add方法添加4個元素 } Console.WriteLine("ArrayList動態(tài)數(shù)組中元素的個數(shù)為:"+aryList.Count); //Count屬性string[] Str = {"abc","xyz"}; aryList.AddRange(Str); //AddRange(數(shù)組名)將Str數(shù)組中所有元素添加到aryList動態(tài)數(shù)組末尾 Console.WriteLine("ArrayList動態(tài)數(shù)組中元素的個數(shù)為:"+aryList.Count);aryList.RemoveAt(1); //刪除索引為1的元素(0開始索引)即:數(shù)字1(第二項) aryList.Remove("abc"); //刪除值第一個為”abc”的值Console.WriteLine("遍歷輸出ArrayList動態(tài)數(shù)組中所有元素"); foreach(object list in aryList) //遍歷輸出動態(tài)數(shù)組aryList中所有元素 {Console.WriteLine(list.ToString()); }輸出結果如下圖所示:
五.#region..#endregion
C#中使用預處理指令可以禁止編譯器編譯代碼的某部分,還可以禁止編譯器與額外功能相關的代碼,預處理指令的開頭都是#符號,如:#define、#undef、#if、#elif、#else、#endif、#warning、#error、#regoin、#endregion、#line、#pragma。這里我主要想講講#region..#endregion的用法。
#region..#endregion指令用于將一段代碼標記給指定名稱的塊,實現(xiàn)指定展開或折疊代碼塊。#region塊必須以#endregion指令終止。格式為:#region 名稱 ... #endregion.如下圖所示:
#region 屬性//狀態(tài)處理對應的操作菜單private ContextMenu menuDelSet;private MenuItem menuSet;private MenuItem menuDel;private MenuItem dynamicModel;public LoadData loadData;public List<object> aryRects; //存放所有Rectangle對象private List<object> aryLines; //存放所有Line對象public List<VarBase> varList; //存放所有的變量private List<int> usedModelID; //已使用的模型IDprivate List<int> toUseModelID; //可用的模型ID//Undo or Redo 規(guī)定只保存5次private UndoBuffer undoB;private shapeRect gRect = null; //在Form中被選中的唯一,模型;private shapeRect gFrom = null;private shapeRect gTo = null; //畫線時的from 和 toprivate shapeLine gLine = null;private Point firstStart;private Point lastStart; //記錄鼠標起始位置private const int iRectW = 80; //狀態(tài)對象矩形的寬度;private const int iRectH = 40; //狀態(tài)對象矩形的高度;#endregion使用它的優(yōu)點是可以被某些編譯器識別,包括Visual Studio .NET編譯器,這些編譯器可以使用這些指令使代碼在屏幕上更好地布局,能隱藏代碼便于管理和查看,如下圖所示是在工程中隱藏了相應部分功能代碼的例子,給人一目了然的感覺。
希望這些知識點能幫助鞏固和學習C#知識,同時這僅僅是我在學習C#中遇到的自認為比較特殊的知識點,如果敘述中有錯誤或不足之處見諒!不太會排版,見諒!
(By:Eastmount 2013-8-25 夜1點http://blog.csdn.net/eastmount/)
總結
以上是生活随笔為你收集整理的C# 基础知识 (二).独特的知识及用法篇的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# 基础知识 (一).概念与思想篇
- 下一篇: C# 连接SQLServer数据库及登录