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);
}
四.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#中遇到的自認為比較特殊的知識點,如果敘述中有錯誤或不足之處見諒!不太會排版,見諒!
相關推薦
C# 基礎知識 (二).獨特的知識及用法篇
在C#中有一些我自己認為比較獨特的知識點,這些知識點是我經常使用的知識,但對它們的瞭解還是比較少的,所以通過查詢資料學習,總結了這些獨特的知識點並簡單敘述,希望對大家有所幫組!其中主要有:var關鍵字
STM32基礎知識4-va_list原理及用法
VA_LIST 是在C語言中解決變參問題的一組巨集,變參問題是指引數的個數不定,可以是傳入一個引數也可以是多個;可變引數中的每個引數的型別可以不同,也可以相同;可變引數的每個引數並沒有實際的名稱與之相對應,用起來是很靈活。 下面是va_list的用法示例 : #i
C#基礎之 二十 設計模式之簡單工廠模式及介面
前言 這幾天看了這些視訊進行了一些總結,我是打算先看完C#視訊然後繼續看設計模式這本書的,但是視訊中提到了一部分設計模式中的內容,那麼我也多少的總結一下吧,有助於後邊對設計模式的學習! 交流與互動
c++基礎:資料型別轉換及處理(二)檔案路徑擷取檔名
繼續昨天未寫完的...我是初學者,如果覺得太簡單,勿噴,如果有什麼錯誤之處,請指出,多謝~! 今天整理了寫的根據檔案路徑擷取檔名相關程式碼,主要包含替換路徑中的“/”為“'\”,然後根據“\”擷取最後的字串,即檔名 一、字串完全替換 以下方法可以替換掉
C#基礎整理(二)
直接 改變 void 重用 必須 類型 ima 命名空間 ram 1、變量類型int、double、string、char、bool、decimal變量使用規則:先聲明,再賦值,最後使用 2、命名規範:Camel:第一個單詞首字母小寫,其他單詞首字母大寫,其余字母小寫Pa
C#基礎之 二十二 C#窗體中常用的控制元件
前言 第一次看這部分的視訊的時候,我就有一個非常深的感觸,當時看到這些控制元件的名稱和“長相”之後,覺得和VB真的是如出一轍,沒有什麼不一樣的,只不過這一個是C#,以前接觸的是VB,這樣的話應該還是比較容易接受的
C++ 字串的分割函式split 及 用法
之前在C#中總用到字串的分割,使用系統函式即可,比如: string a = "This is a test"; string[] strArray = a.Split(' '); 在C++中string沒有直接的分割函式,可以利用C的stroke函式封裝一個分割方法: vector<
c++基礎:資料型別轉換及處理(一)string轉wstring及檔案拷貝
使用java太長時間,已經習慣了其資料型別轉換及處理的便捷。但是,現在使用c++,不得不去面對其資料型別轉換,以及相關的處理。瞬間感覺奔潰,一天中,很多時間都交給度娘了... 檔案拷貝 本來很方便,提供了CopyFile,但是看到入參,瞬間崩潰,普通字串不行
C#基礎概念二十五問
2008年03月29日 10:50:00 一等兵 閱讀數:517 標籤: c#
<C++基礎學習二十>特殊用途語言特性(未完待續)
ack char 刪除 默認值 網上 clas grand c++ class 摘要: 本篇博客僅作為筆記,如有侵權,請聯系,立即刪除(網上找博客學習,然後手記筆記,因紙質筆記不便保存,所以保存到網絡筆記)。 一、默認實參 某些函數有這樣一些形參,在函數的很多次調用
C# 基礎(二十)C# 介面詳細解析:介面的定義、介面的優點、介面應用舉例
一、簡介 1、介面的定義 常用的介面,一般定義了 方法和屬性,比如: //賬戶介面1(所有銀行賬戶類都要繼承此介面) public interface IBankAccount { void PayIn(decimal amount);//存錢
Windows Server 2008 R2應用基礎-實驗二-檔案許可權及檔案共享
實驗要求 實驗內容及步驟 掌握 NTFS 與 FAT32 檔案系統的區別,觀察各分割槽的檔案系統 比較同同一分割槽和不同 NTFS 分割槽上進行檔案複製、移動時檔案許可權的變化 設定檔案加密、壓縮 在 NTFS 分割槽建立資料夾 temp,進入屬性頁面中的“安
C#基礎概念二十五問 --【C#網文收集系列】
注:本文部份資料來自網路,如有侵權,請與我聯絡,我會在第一時間宣告引用或將其刪除! 當初學 C# 時是找個人大概問了一下資料型別和分支語句就開始做專案了。這兩天又全面的看了一下相關的基礎知識(學而時習之嘛),總結了25個問題: 1.靜態變數和非靜態變數的區別?2.c
9、C語言中二維陣列及陣列名及指向二維陣列的指標變數
#include <stdio.h> #include <stdlib.h> //與二維陣列相關的指標變數([] 比 *優先順序高) //在一般指標變數指向二維陣列,或者n維陣列,要直接操作a[i][j],對指標的操作必須有兩個符號(其中不出現&,如果有&則相應的加
C#基礎概念二十五問[轉]
注:本文部份資料來自網路,如有侵權,請與我聯絡,我會在第一時間宣告引用或將其刪除! 當初學 C# 時是找個人大概問了一下資料型別和分支語句就開始做專案了。這兩天又全面的看了一下相關的基礎知識(學而時習之嘛),總結了25個問題: 1.靜態成員和非靜態成員的區別?2.c
#Java學習之路——基礎階段二(第十四篇)
out 出現 萬能 -c ack 分隔 status osi 版本 我的學習階段是跟著CZBK黑馬的雙源課程,學習目標以及博客是為了審查自己的學習情況,畢竟看一遍,敲一遍,和自己歸納總結一遍有著很大的區別,在此期間我會參雜Java瘋狂講義(第四版)裏面的內容。 前言:此隨
C# 基礎知識系列- 9 字串的更多用法(二)
0. 前言 上一篇文章介紹了字串自身的一些方法,就是物件方法。在字串體系中,還有一些是string類提供的靜態方法。這兩部分構成了字串體系,當然還有一些三方庫為字串提供了擴充套件方法。 這裡簡單的介紹一下string類的靜態方法。 1. 玩轉建立字串 1.1 Create一個字串 通過呼叫string.Cre
C#基礎知識總結(二)
摘要 第二篇主要講:變數、連線符佔位符等、轉義字元、資料的計算、資料的轉換、try-catch的簡單熟悉、複合運算子和自加自減 一、變數 1.資料儲存在記憶體中:記憶體叫做RAM,記憶體被分隔為一小格一小格的,每個小格有個地址。記憶體的特點是:斷電後資料丟失 2.變數:變數代表著一塊記憶體空間,我
C++基礎知識(二)--左值右值--邏輯表示式求值優化--逗號運算子與表示式
一、C++左值右值概念 左值:c++將變數名代表的單元稱為左值,而將變數的值稱為右值,左值必須是記憶體中可以訪問且可以合法修改的物件,因此只能是變數名,而不能是常量或表示式。即左值可以定址。 右值:將變數的值稱為右值,由運算操作(加減乘除,函式呼叫返回值等)所產生的中間結果(沒有名字的結果)稱為右
C++基礎知識(二)--左值右值--邏輯表達式求值優化--逗號運算符與表示式
-- 沒有 加減乘除 p s 能夠 表示 操作 逗號 因此 一、C++左值右值概念 左值:c++將變量名代表的單元稱為左值,而將變量的值稱為右值,左值必須是內存中可以訪問且可以合法修改的對象,因此只能是變量名,而不能是常量或表達式。即左值可以尋址。 右值:將變量的值