閱讀376 返回首頁    go 阿裏雲 go 技術社區[雲棲]


C# 基礎知識 (二).獨特的知識及用法篇

C#中有一些我自己認為比較獨特的知識點,這些知識點是我經常使用的知識,但對它們的了解還是比較少的,所以通過查找資料學習,總結了這些獨特的知識點並簡單敘述,希望對大家有所幫組!其中主要有:var關鍵字、try..catch..finally、foreach語句、ArrayList類、#region..#endregion等知識點。

一.var關鍵字

隱含類型,使用var來聲明任意類型的局部變量。C#中它僅僅是一個關鍵字,不代表一種新的類型,它僅是負責告訴編譯器:該變量需要根據初始化表達式來推斷變量的類型,而且隻能是局部變量。Var聲明變量後,變量類型就確定下來了,不會在變。例:

var str = “Hello world”;       
//string類型,相當於 string str = “Hello world”

var request = (HttpWebRequest)WebRequest.Create(url);
//這是http網絡編程中我使用的例子,var可用HttpWebRequest類型替換

二.try..catch..finally

用於處理異常,通常有三中異常處理語句:

(1).try…catch;                //處理異常

(2).try…finally;               //清除異常

(3).try…catch…finally;  //處理所有異常

try塊中包含容易產生異常的代碼,使用引發異常語句,接著捕獲異常;try塊中發生異常後跳轉到catch異常處理程序,catch用於異常處理程序,通常格式為:catch(異常類 異常對象實例){…}

例1:(參考自《從零開始學C#》)

int [] nums = {1,2,3,4,5,6,7,8,9};  //定義整形數組
try
{
	for(int i=0;i<=num.Length;i++)
	{
		Console.Write(num[i].ToString()+” ”);
	}
} 
catch(Exception ex)
{
	Console.Write(ex.Message.ToString());  //輸入異常錯誤
}

Try語句捕獲異常,由於數組索引從0開始遍曆,用“<=”會遍曆10次,多遍曆一次,出現索引越界,跳轉到catch語句先創建一個異常的對象ex並輸出錯誤信息。運行結果如下圖所示:

finally用於清除產生錯誤分配的資源,在使用try..catch..finally語句中即使引發異常,finally塊中的代碼也會被執行(始終執行),從程序中釋放資源。try..catch..finally語句捕獲錯誤、清除並執行應用程序,無論有沒有異常都會執行,出現異常是執行順序為:try->catch->finally;沒有異常執行順序為:try->finally。下麵看一個實際工程中使用的例子:

例2:(這是我在C#網絡編程中自己編寫的代碼)

try
{
	Stream=response.GetResponseStream();    //獲取應答流
	…                                       //具體通訊瀏覽器操作
}
catch (Exception msg)
{
	MessageBox.Show(msg.Message);           //異常處理
}
finally
{
	stream.Close();                         //釋放資源:關閉流操作
}

這是C#瀏覽器中出現異常情況(斷開網絡連接訪問)執行結果如下圖所示:

最後注意,處理異常會大大降低性能,所以不要將它用在控製正常程序流程中,如果有可能檢測到代碼中異常,請替代try..catch..finally操作。如在出發中除數不能為0這個異常我們可以用if判斷不為0在進行除法操作,這樣就實現了替換。(自定義異常throw這裏我就不在介紹了)

三.foreach循環語句

foreach語句為數組或對象集合中的每一個元素重複一個嵌入語句組,用於循環訪問集合以獲取所需信息,需要調用IEnumerable接口,其格式:foreach(類型變量 in 集合) { … //操作}每執行一次,循環變量就依次取集合中的一個元素操作。foreach語句的主要特點是代碼簡潔,效率又高。

例1:(foreach語句簡單迭代)

int [] nums = {1,2,3,4,5,6,7,8,9};  //定義整形數組
foreach(int i in nums)
{
	Console.WriteLine(i);            //循環輸出數組
}
//相當於:for(int i=0;i<nums.Length;i++) {...}

注意:在如上述一維或多維數組遍曆中,盡量使用foreach語句,他會自動檢查數組的索引,使其不會出現越界錯誤。而在上麵數組訪問中for循環語句每執行一次都會對數組索引有效值進行判斷是否越界(相當於使用if-else判斷)foreach會避免這樣情況相對效率較高。同時,如果采用多維數組操作foreach會更加方便,它隻需一層循環,而for語句需要多層循環來執行。

例2:(foreach與for語句多維數組對比)

int [,] intArray = new int[4,4] {{5,2},{1,2},{3,4}…}
foreach(int i in intArray)
{
	Console.WriteLine(i);
}
//而采用for語句需要兩層循環執行
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;                          //記錄選中對象個數
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#編寫畫圖軟件,通過判斷在圖上已經被鼠標左鍵選中的圖形的個數及相應屬性實現移動、刪除等功能。運行結果如下:

顯然,使用for想實現上麵的功能是非常困難,甚至無法實現的,這就是foreach的好處及實際工程中的應用。foreach語句需要注意:這裏的循環變量是一個隻讀型局部變量,如果嚐試改變其值或刪除會發生編輯錯誤。

foreach(int I in nums)
{
	i++;                 //不能修改值
	Console.WriteLine(i);
}
//它提示的錯誤信息為:i是一個foreach迭代變量,無法為它賦值
foreach(int I in nums)
{
	nums.Remove(i);      //不能刪除值
	Console.WriteLine(i);
}

這隻是我對foreach的一些簡單認識,其中一些知識點及思想還引用了該文章,這是一篇非常優秀的關於foreach語句的文章,感謝原作者和轉載作者:https://blog.csdn.net/huang7914/article/details/2296176

四.ArrayList類

數組通常大小固定後就不能更改,但C#提供了動態數組ArrayList類實現動態添加、插入或移除元素的方法,更加靈活的設置數組大小。在使用該類前必須要聲明System.Collections命名空間,ArrayList的屬性和方法如下:

ArrayList類屬性表

(由於使用CSDN插入表格間距太大,不知道怎樣設置行間距,才換成了圖片格式,見諒!)

ArrayList類常用方法表

(上麵的兩個表格都轉自孫景瑞的《從零開始學C#》,非常優秀的一本書籍,推薦大家看看,同時感謝作者,這裏引用了他的知識結晶)

例:

ArrayList aryList = new ArrayList();
for(int i=0;i<4;i++)
{
    aryList.Add(i);                //使用add方法添加4個元素
}
Console.WriteLine("ArrayList動態數組中元素的個數為:"+aryList.Count);  //Count屬性
            
string[] Str = {"abc","xyz"};         
aryList.AddRange(Str);            //AddRange(數組名)將Str數組中所有元素添加到aryList動態數組末尾
Console.WriteLine("ArrayList動態數組中元素的個數為:"+aryList.Count);
            
aryList.RemoveAt(1);               //刪除索引為1的元素(0開始索引)即:數字1(第二項)
aryList.Remove("abc");             //刪除值第一個為”abc”的值
            
Console.WriteLine("遍曆輸出ArrayList動態數組中所有元素");
foreach(object list in aryList)    //遍曆輸出動態數組aryList中所有元素
{
	Console.WriteLine(list.ToString());
}

輸出結果如下圖所示:

五.#region..#endregion

C#中使用預處理指令可以禁止編譯器編譯代碼的某部分,還可以禁止編譯器與額外功能相關的代碼,預處理指令的開頭都是#符號,如:#define、#undef、#if、#elif、#else、#endif、#warning、#error、#regoin、#endregion、#line、#pragma。這裏我主要想講講#region..#endregion的用法。

#region..#endregion指令用於將一段代碼標記給指定名稱的塊,實現指定展開或折疊代碼塊。#region塊必須以#endregion指令終止。格式為:#region 名稱 ... #endregion.如下圖所示:

 #region 屬性
        //狀態處理對應的操作菜單
        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;         //已使用的模型ID
        private List<int> toUseModelID;        //可用的模型ID

        //Undo or Redo 規定隻保存5次
        private UndoBuffer undoB;

        private shapeRect gRect = null;        //在Form中被選中的唯一,模型;
        private shapeRect gFrom = null;
        private shapeRect gTo = null;          //畫線時的from 和 to
        private shapeLine gLine = null;

        private Point firstStart;
        private Point lastStart;               //記錄鼠標起始位置

        private const int iRectW = 80;         //狀態對象矩形的寬度;
        private const int iRectH = 40;         //狀態對象矩形的高度;
       
#endregion

使用它的優點是可以被某些編譯器識別,包括Visual Studio .NET編譯器,這些編譯器可以使用這些指令使代碼在屏幕上更好地布局,能隱藏代碼便於管理和查看,如下圖所示是在工程中隱藏了相應部分功能代碼的例子,給人一目了然的感覺。

希望這些知識點能幫助鞏固和學習C#知識,同時這僅僅是我在學習C#中遇到的自認為比較特殊的知識點,如果敘述中有錯誤或不足之處見諒!不太會排版,見諒!

(By:Eastmount 2013-8-25 夜1點https://blog.csdn.net/eastmount/)

最後更新:2017-04-03 16:49:00

  上一篇:go Oracle同義詞創建及其作用
  下一篇:go Java文件編譯的兩種方式以及在SpringMVC傳參中帶來的問題