版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
、c#基礎(chǔ)知識Q)
1、C#中foreach用法
foreach循環(huán)用于列舉出集合中所有的元素,foreach語句中的表達式由關(guān)鍵字
in隔開的兩個項組成。in右邊的項是集合名,in左邊的項是變量名,用來存放
該集合中的每個元素。
該循環(huán)的運行過程如下:每一次循環(huán)時,從集合中取出一個新的元素值。放到只
讀變量中去,如果括號中的整個表達式返回值為true,foreach塊中的語句就能
夠執(zhí)行。一旦集合中的元素都已經(jīng)被訪問到,整個表達式的值為false,控制流
程就轉(zhuǎn)入到foreach塊后面
的執(zhí)行語句。
foreach語句經(jīng)常與數(shù)組一起使用,下面實例將通過foreach語句讀取數(shù)組的值
并進行顯示。
數(shù)組的屬性:Array.Length數(shù)組的容量
利用這個屬性,我們可以取得數(shù)組對象允許存儲的容量值,也就是數(shù)組的長度、
元素個數(shù),這個比較好理解,數(shù)組還有其他的屬性,比如數(shù)組的維數(shù)等,屬性的
用法比較簡單,學(xué)會一種,其他的格式基本一致,這里我們就不舉例了。
當(dāng)數(shù)組的維數(shù)、容量較多時,C#提供了foreach語句,專門用來讀取集合/數(shù)組
中的所有元素,我們把這種功能叫做遍歷。語法書寫如下:
遍歷數(shù)組:foreach(typeobjNameincollection/Array)
這段語句會逐一檢查數(shù)組中的所存儲的變量值,并且一一將其取出,其中的type
是你所要讀取的數(shù)組對象將要存儲在objName變量的數(shù)據(jù)類型,而objName是定
義了一個type類型的變量名,代表每一次從集合和數(shù)組(collection/Array)
中取得的元素,collection/Array則是所要存取的數(shù)組對象。用這種方法只需
寫一個foreach就可以遍歷出除交錯數(shù)組以外的所有維數(shù)的數(shù)組。
例子:用foreach循環(huán)一次性遍歷a數(shù)組
int[,,]a=newint[2,2,2]{{{1,2},{3,4}},{{5,
6},{7,8}}};〃定義一個2行2列2縱深的3維數(shù)組a
foreach(intiina)
Console.WriteLine
(i);
這兩種代碼執(zhí)行的結(jié)果是一樣的都是每行一個元素,共8行,元素分別是123
45678
string口數(shù)組里面是存放string型的值,List〈string>是存放string類型的對
象
2、C#中的InitializeComponent。方法
lnitializeComponent()用于初始化窗體上控件。
在每?個窗體生成的時候,都會針對于當(dāng)前的窗體定義InitializeComponent。方法,該
方法實際上是由系統(tǒng)生成的對于窗體界面的定義方法。
〃位于.cs文件之中的InitializeComponent。方法
publicForm011()
{
lnitializeComponent();
)
在每一個Form文件建立后,都會同時產(chǎn)生程序代碼文件.CS文件,以及與之相匹配
的.Designer.CS文件,業(yè)務(wù)邏輯以及事件方法等被編寫在CS文件之中,而界面設(shè)計規(guī)則
被封裝在.Designer.CS文件里,下面代碼為.Designer.CS文件的系統(tǒng)自動生成的腳本代碼。
namespaceExample_FormTest
{
partialclassfrmStudent
(
///<summary>
///必需的設(shè)計器變量。
///</summary>
privateSystem.ComponentModeLIContainercomponents=null;
///<summary>
///清理所有正在使用的資源。
///</summary>
///<paramname="disposing"〉如果應(yīng)釋放托管資源,為true:否則為false。v/param>
protectedoverridevoidDispose(booldisposing)
if(disposing&&(components!=null))
components.Dispose();
)
base.Dispose(disposing);
)
#regionWindows窗體設(shè)計器生成的代碼
///<summary>
///設(shè)計器支持所需的方法?不要
///使用代碼編輯器修改此方法的內(nèi)容。
///</summary>
privatevoidlnitializeComponent()
(
this.SuspendLayout();
//
//frmStudent
//
this.AutoScaleDimensions=newSystem.Drawing.SizeF(6F,12F);
this.AutoScaleMode=System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize=newSystem.Drawing.Size(292,273);
this.Name="frmStudenC;
this.Text="學(xué)生信息”;
this.MouseClick+=new
System.Windows.Forms.MouseEventHandler(this.frmStudent_MouseClick);
this.KeyPress+=new
System.Windows.Forms.KeyPressEventHandler(this.frmStudent_KeyPress);
this.ResumeLayout(false);
)
#endregion
)
)
在代碼之中,可以很容易發(fā)現(xiàn)InitializeComponent。方法和Dispose。方法,前者為界
面設(shè)計的變現(xiàn)內(nèi)容,后者為表單釋放系統(tǒng)資源時候執(zhí)行編碼。
lnitializeComponent()方法反映了窗體設(shè)計器中窗體和控件的屬性。通常不會在世界上個文
件中修改代碼。如果更改InitializeComponent。方法中的相關(guān)屬性參數(shù),在窗體設(shè)計器界面
上也會顯示出來。
我們發(fā)現(xiàn)建?個c#窗體項目,在Form1.cs和Form1.Designer.cs里分別有'?個
InitializeComponent。函數(shù)
Form1.Designer.cs里的是定義(函數(shù)名后面有大括號包含定義內(nèi)容)
Form1.cs里的是調(diào)用(函數(shù)名后面分號結(jié)尾)
partial表示以下創(chuàng)建的是分布類代碼
也就是說一個類的定義代碼可以寫在兩個不同的頁面
Form1.cs和Form1.Designer.cs
注意:IrdtializeComponent。方法寫在前面和后面是有區(qū)別的。InitializeComponent。方法是
用來初始化窗體組件的,在InitializeComponent之前,窗體的各個控件還沒有進行初始化,
比如說窗體上有一個TextBoxUserName,在InitializeComponent之前它還只是一個
TextBox類型的變量而已,如果在IrdtializeComponent之前調(diào)用這個TextBox的屬性或方
法,就會出錯。再比如說你拖上取一個TextBox,它放在Form的位置,TextBox的一些屬性。
包括new這個TextBox都放在那個函數(shù)里面處理的。
我們可以看一下Form.Designer.cs,在那里找到InitializeComponent方法,您會發(fā)現(xiàn)窗體
對象的初始化都是在那里做的。
3>C#里面的#region是什么意思?
Sregion是c#預(yù)處理器指令。
#region是一個分塊預(yù)處理命令,它主要用于編輯代碼的分段,在編譯
時會被自動刪除。
#region使你可以在使用VS代碼編輯器的大綱顯示功能時指定可展開或
折疊的代碼塊。
例如:
El#regionMyClassdefinition
IpublicclassMyClass
由{
staticvoidMain()
由(
卜)
卜}
#endregion
備注:#region塊必須以#endregion指令終止。
#region塊不能V#if塊重疊。但是,可以將#region塊嵌套在#1£
塊內(nèi),或?qū)?if塊嵌套在#region塊內(nèi)。
?使用#region就是將一些有關(guān)聯(lián)的代碼組織在一起,然后折疊起來。這樣你就在一個函
數(shù)中看不到很長的令人頭痛的代碼段。
?當(dāng)然這段代碼很簡單。在實際項目中,你可能看到上百行甚至更多的代碼在一個#region
中。如果把它折疊起來。看起來就會很整潔。
?region不適合在大方法中使用,當(dāng)你在―一個方法中使用#region的時候,停下來想想
你剛剛寫了什么代碼?大多數(shù)時候,你可以將這些代碼段獨立成一個函數(shù)。
4、C#中this的作用
在CM」,this關(guān)鍵字代表當(dāng)前實例,我們可以用this.來調(diào)用當(dāng)前實例的成
員方法,變量,屬性,字段等;也可以用this來做為參數(shù)狀當(dāng)前實例做為參數(shù)傳
入方法.還可以通過this□來聲明索引器。下面介紹C#中this的作用
一、C#this指針的幾種用法
1、限定被相似的名稱隱藏的成員
C#代碼復(fù)制
publicclassThisName
publicstringname="張三”;
publicintnum=55;
白publicThisName(){}
I
IpublicvoidGetThisName(stringname,intnum)
I
(
name=this,name;〃調(diào)取全局變量name
num=this,num;〃調(diào)取全局變量num
HttpContext.Current.Response.Write("參數(shù)name的值
為:"+name+”;參數(shù)num的值為:"+num);〃輸出結(jié)果為"參數(shù)name的值為張.七參
數(shù)num值為:55”
}
L
2、將對象作為參數(shù)傳遞到別的方法中
C#代碼復(fù)制
publicclassThisFF
publicThisFF()
卜)
I
publicstringshuju()
I
由{
I
Ireturn"This指針當(dāng)做方法傳遞“;
I
卜)
I
publicvoidfl(ThisFFff)
I
白{
I
HttpContext.Current.Response.Write(ff.shuju());
I
卜)
I
publicvoidf()
I
由{
I
fl(this);〃this在這里可以理解為ThisFFff=newsThisFF();
當(dāng)前類的實例
I
卜)
I
L}
ThisFFff=newsThisFF。;〃方法實例
ff.f();〃調(diào)用方法輸出結(jié)果為:This指針當(dāng)做方法傳遞
3、聲明索引器
c#代碼復(fù)制
privateint_Sy;
publicintthis[intsy]
□(
get(return_Sy;}
Qset{sy=_Sy;}
二、C#中this的總結(jié)
1、Ihis關(guān)鍵字引用被訪問成員所在的當(dāng)前實例。靜態(tài)成員函數(shù)沒有this指針。
this關(guān)鍵字可以用來從構(gòu)造函數(shù),實例方法和實例化訪問器中訪問成員,不能
在靜態(tài)方法。靜態(tài)屬性訪問器或者域聲明的變量初始化程序中使用this關(guān)鍵字,
這將會產(chǎn)生錯誤。
2、在類的構(gòu)造函數(shù)中出現(xiàn)的this作為一個值類型表示對正在構(gòu)造的對象本身的
引用。
3、在類的方法中出現(xiàn)this作為一個值類型表示對調(diào)用該方法的對象的引用。
4、在結(jié)構(gòu)的構(gòu)造函數(shù)中出現(xiàn)的this作為一個變量類型表示對正在構(gòu)造的結(jié)構(gòu)的
引用。
5、在結(jié)構(gòu)的方法中出現(xiàn)的this作為一個變量類型表示對調(diào)用該方法的結(jié)構(gòu)。
5、[c#.net]SuspendLayout和ResumeLayout
在Designer中會看到這兩個方法,究竟是做什么用的呢?
一般在加載所有控件之前SuspendLayoul方法,掛起所有控件在界面的邏輯布局事件,等又有布局代碼完
后再調(diào)用ResumeLayout事件吧剛才掛起的邏輯布局一并執(zhí)行。
例如我們在設(shè)置初始化控件時候,都會用到Size、Location^Anchor或Dock屬性,而每一個屬性都會去
改變控件在界面上的布局,使得控件,每執(zhí)行一段代碼就就要界面重繪一次,那么我們先掛起所有事件,
之后一起執(zhí)行,這樣就可以提高帶有許多控件的應(yīng)用程序的性能。
控件的布局邏輯被掛起,直到調(diào)用ResumeLayout方法為止。
當(dāng)調(diào)整控件的多個屬性時,將先后使用SuspendLayout和ResumeLayout方法
取消多個Layout事件。例如,通常先調(diào)用SuspendLayout方法,然后設(shè)置控
件的Size^Location>Anchor或Dock屬性,最后調(diào)用ResumeLayout方法以
使更改生效。
注意:為了防止layout事件的發(fā)生。這個事件將引發(fā)重新繪圖的事件,如果介面上控件較多的話,改變控
件某些屬性時,由于不斷地重畫,性能變低,所以用suspendlayout來阻止。
resumelayou可以結(jié)束上面的限制。
6、C#中的set和get方法
在面向?qū)ο缶幊蹋∣OP)中,是不允許外界直接對類的成員變量直接訪問的,既然不能訪問,
那定義這些成員變量還有什么意義呢?所以C#中就要用set和get方法來訪問私有成員變
量,它們相當(dāng)于外界訪問對象的一個通道,一個“接口”。先來看一段代碼:
classEmployee
privatestringname;
privatebyteage;
publicstringName
get{returnname;}
set{name=value;}
}
publicbyteAge
get{returnage;)
set{age=value:}
}
)
代碼中定義了兩個私有變量name和age,當(dāng)我們不想讓外界隨意訪問該私有變量時,
可以使用屬性來訪問,語法為:
public〈返回類型(要與被訪問變量的類型相同)>〈屬性名(不能與被訪問變量同名)>
(
get{return〈被訪問變量>;}
set(〈被訪問變量>=value;}
)
當(dāng)我們使用屬性來訪問私有成員變量時就會調(diào)用里面的get方法,當(dāng)我們要修改該變量
時就會調(diào)用set方法,當(dāng)然在定義的時候可以只定義一個get方法或只定義一個set方法。
如果只定義get方法,那么這個相應(yīng)變量就是“只讀”的;如果只定義set方法,那么相應(yīng)
變量就是“只寫”的。
classEmployee
privatestringname;
privatebyteage;
publicstringName
(
get{returnname;}
set{name=value;}
)
〃****修改后****IIl|||||
publicbyteAge
{
get{returnage;}
set
(
if(value>10&&value<=100)//一般在公司雇
員的年齡都在10到100歲之間
age=value;
)
}
//****修改后****ttttfttt
)
上例中,set就像一位門衛(wèi)大叔一樣,只有好人才能進來??梢酝ㄟ^屬性來控制對員變量的
讀寫,防止對成員變量的非法賦值等。
再舉個小例子,以下是個溫度計的類:
classThermometer
(
privatedoubletemperature;
publicThermometer(doubletemperature)//構(gòu)造函數(shù)
(
this,temperature=temperature;
)
publicdoubleTemperature
(
get{returntemperature;}
set{temperature=value;}
)
)
假設(shè)這里的溫度單位表示的是攝氏度(℃),如果在需求分析階段誤解了客戶的原始意愿或
者客戶在日后變更了需求,需要把系統(tǒng)中所有表示溫度的變量temperature都用來表示開爾
文溫度(K)。那么不必動系統(tǒng)中成百上千個Temperature屬性,只需在get和set函數(shù)中
稍微修改一下代碼即可:
classThermometer
(
privatedoubletemperature;
publicThermometer(doubletemperature)//構(gòu)造函數(shù)
(
this,temperature=temperature;
)
publicdoubleTemperature
(
〃****修改后****||||||||
get{returntemperature-273.15;}
set{temperature=value+273.15;}
〃****修改后****fttttttf
}
)
建一個控制臺應(yīng)用程序來測試一下,主函數(shù)為:
classTest
(
staticvoidMain(string[]args)
(
Thermometera=newThermometer(40);
Console.WriteLine(a.Temperature);
)
)
7、override和new的區(qū)別
override
1.override是派生類用來重寫基類中方法的;
2.override不能重寫非虛方法和靜態(tài)方法;
3.override只能重寫用virtual、abstract,override修飾的方法;
4.不能使用修飾符new、static、virtual或abstract來修改override方
法。
new
1.new是派生類用來隱藏基類中的方法的;也就是說在派生類中“看不到”基
類中的方法;
2.如果要在派生類中隱藏(不是重寫)基類中的方法,而沒有使用new關(guān)鍵字,
編譯時會出現(xiàn)一個警告,提示如果是要隱藏基類中的方法,請使用new關(guān)鍵字;
3.派生類可以隱藏基類中的虛方法,也可以隱藏基類中的普通方法。
4.如果在派生類中用private來修飾new方法,那么只在該派生類中隱藏了基
類中的方法,在該派生類之外,相當(dāng)于沒有隱藏基類中的方法;
5.如果在派生類中隱藏了基類中的方法,在該派生類的派生類中,將延續(xù)對該
派生類對基類方法的隱藏。
代碼:
classA
(
publicvirtualvoidFunc()//注意virtual,表明這是一個虛擬函
數(shù)
{
Console.WriteLine(zzFuncInA");
)
)
classB:A//注意B是從A類繼承,所以A是父類,B是子類
(
publicoverridevoidFunc()//注意override,表明重新實現(xiàn)了虛
函數(shù)
(
Console.WriteLine(Z/FuncInB");
classC:B//注意C是從B類繼承,所以B是父類,C是子類
(
)
classD:A//注意D是從A類繼承,所以A是父類,D是子類
(
publicnewvoidFunc()//注意new,表明覆蓋父類里的同名類,而
不是重新實現(xiàn)
{
Console.WriteLine(zzFuncInD");
)
)
classE:D//注意E是從D類繼承,所以D是父類,E是子類
classF:A
{
privatenewvoidFunc()〃注意new關(guān)鍵字前有private修飾符,故
該隱藏只在F類內(nèi)有效
Console.WriteLine(/zFuncInF");
publicvoidFunc2()
Func();〃在F類內(nèi)隱藏了基類的Func方法,故此處調(diào)用的
privatenewvoidFunc()
)
)
staticvoidMain(string[]args)
Aa;//定義一個a這個A類的對象.這個A就是a的申明類
Ab;//定義一個b這個A類的對象.這個A就是b的申明類
Ac;//定義一個c這個A類的對象.這個A就是c的申明類
Ad;//定義一個d這個A類的對象這個A就是d的申明類
Ae;//定義一個e這個A類的對象.這個A就是e的申明類
Af;//定義一個f這個A類的對象.這個A就是f的申明類
a=newA0;//實例化a對象,A是a的實例類
b=newB0;//實例化b對象,B是b的實例類
c=newCO;//實例化c對象,C是c的實例類
d=newDO;//實例化d對象,D是d的實例類
e=newE();//實例化e對象,E是e的實例類
f=newF();//實例化f對象,F是f的實例類
Console.WriteLine("a.Func();");
a.Func();//執(zhí)行a.Func:1.先檢查申明類A2.檢查到是虛擬方
法3.轉(zhuǎn)去檢查實例類A,就為本身4.執(zhí)行實例類A中的方法5.輸出結(jié)果Func
InA
Console.WriteLine("b.Func();");
b.FuncO;//執(zhí)行b.Func:1.先檢查申明類A2.檢查到是虛擬方
法3.轉(zhuǎn)去檢查實例類B,有重載的4.執(zhí)行實例類B中的方法5.輸出結(jié)果Func
InB
Console.WriteLine(z,c.Func();");
c.Func();//執(zhí)行c.Func:1.先檢查申明類A2.檢查到是虛擬方
法3.轉(zhuǎn)去檢查實例類C,無重載的4.轉(zhuǎn)去檢查類C的父類B,有重載的5.執(zhí)行
父類B中的Func方法5.輸出結(jié)果FuncInB
Console.WriteLine(z,d.Func();");
d.FuncO;//執(zhí)行d.Func:1.先檢查申明類A2.檢查到是虛擬方
法3.轉(zhuǎn)去檢查實例類D,無重載的(這個地方要注意了,雖然D里有實現(xiàn)Func(),
但沒有使用。verride關(guān)鍵字,所以不會被認(rèn)為是重載)4.轉(zhuǎn)去檢查類D的父類
A,就為本身5.執(zhí)行父類A中的Func方法5.輸出結(jié)果FuncInA
Console.WriteLine(z,e.Func();");
e.Func();//執(zhí)行e.Func:E繼承D,E.Func沒有重寫父類中的
方法,相當(dāng)于執(zhí)行父類D中的Func方法,輸出結(jié)果FuncInA
Console.WriteLine("f.Func();");
f.Func();//執(zhí)行f.Func:F類中雖然隱藏了基類中的Func方法,
但是有private修飾符,該隱藏只在F類范圍內(nèi)有效。執(zhí)行f.Func相當(dāng)于執(zhí)行
其基類中的Func方法,輸出結(jié)果FuncInA
Ddl=newD();
Console.WriteLine(/zdl.Func();〃);
dl.FuncO;//執(zhí)行D類里的Func(),輸出結(jié)果FuncInD
Eel=newE();
Console.WriteLine(z/el.Func0;〃);
el.Func();//執(zhí)行E類里的Func(),輸出結(jié)果FuncInD
Ffl=newF();
Console.WriteLine(z,fl.Func();〃);
fl.FuncO;//執(zhí)行F類里的FuncO,輸出結(jié)果FuncInA
Console.WriteLineC'fl.Func2();〃);
fl.Func2();//執(zhí)行F類里的Func2(),輸出結(jié)果FuncInF
Console.ReadLine();
)
8、MarshalAs的使用
作用:
Marshals屬性指示如何在托管代碼和非托管代碼之間封送數(shù)據(jù)。
使用方法:
[MarshalAs(UnmanagedTypeunmanagedType,命名參數(shù))]
實際上相當(dāng)于構(gòu)造一個MarshalAsAttribute類的對象
常用的UnmanagedType枚舉值:(詳細(xì)內(nèi)容查MSDN)
BStr長度前綴為雙字節(jié)的Unicode字符串;
LPStr單字節(jié)、空終止的ANSI字符串。;
LPWStr一個2字節(jié)、空終止的Unicode字符串;
ByValArray用于在結(jié)構(gòu)中出現(xiàn)的內(nèi)聯(lián)定長字符數(shù)組,應(yīng)始終使用
MarshalAsAttribute的SizeConst字段來指示數(shù)組的大小。
注意:
在用Marshal.SizeOfO,即獲取對象的非托管大小時,獲得的是自己定義的大
??;
但在實際處理的時候,是按照實際的大小來獲取的
示例:
定義一個固定大小的結(jié)構(gòu)體,代碼如下:
結(jié)構(gòu)的聲明:
[csharp]viewplaincopy
1.structInfo
2.{
3.[MarshalAs(UnmanagedType.ByValArray,SizeConst=16)]
4.publicchar[]name;
5.[MarshalAs(UnmanagedType.ByValArray,SizeConst=16)]
6.publicchar[]cipher;
7.[MarshalAs(UnmanagedType.ByValArray,SizeConst=256)]
8.publicchar[]signature;
9.)
結(jié)構(gòu)的使用:
[csharp]viewplaincopy
1.InfomyInfo;
2.=name.ToCharArray();
3.mylnfo.cipher=cipher.ToCharArray();
4.mylnfo.signature=signature.ToCharArray();
注意:
[csharp]viewplaincopy
1.intsize=Marshal.SizeOf(mylnfo);
size=16+16+256
可見,獲取到的非托管大小為288
但是,查看mylnfo對象可以看到其實際大小如下所示:
mylnfo
{fixedTest.Program.Info}
cipher:{char[7])
name:{char[10]}
signature:{char[10]}
問題:
這種實際大小和固定大小的不一致性,導(dǎo)致了在用Marshal類進行托管對象和非
托管對象的轉(zhuǎn)換時,會有如下錯誤提示:“未能封送類型,因為嵌入數(shù)組實例的
長度與布局中聲明的長度不匹配。”
小結(jié):
MarshalAs這個屬性很難用,很容易用錯,用好需要對C#、C++和COM數(shù)據(jù)的布局方式有一
定的了解才能做。所以做好使用一些工具來幫你,可以參照我下面的文章:
http:〃/Doniuan/archive/2009/02/05/3865026.aspx
如果你只是感興趣的話,那就忘了這個屬性吧,在.NET4.0以后,微軟會盡量解決掉這個屬
性。
9、實例化
實例化是指在面向?qū)ο蟮木幊讨?,通常把用類?chuàng)建對象的過程稱為實例化。格式化有類
名,對象名=new類名(參數(shù)1,參數(shù)2…參數(shù)n)0
在面向?qū)ο蟮木幊讨?通常把用類創(chuàng)建對象的過程稱為實例化,其格式如下:
如Datedate:newDate。;就是用日期類創(chuàng)建了一個日期的對象,就叫對象的實例化。
〃〃類名是你用來定義類的,類相當(dāng)于一個模板。比如說世界上很多人,我們就可以定義
一個Person類:
PublicPerson
(
PublicStringName{get;set;}
PublicStringAge{get;set;}
)
這是類的創(chuàng)建。
每個人又是有區(qū)別的,那我們就可以根據(jù)Person類來創(chuàng)建不同的人,比如說:
Personpl=NewPerson(){Name="A"zAge="22"}
PersonQ2=NewPerson(){Name="B",Age="23"}
10>C#中的異常處理入門trycatchthrow
軟件運行過程中,如果出現(xiàn)了軟件正常運行不應(yīng)該出現(xiàn)的情況,軟件就出現(xiàn)了異
常。這時候我們需要去處理這些異常。或者讓程序終止,避免出現(xiàn)更嚴(yán)重的錯誤。
或者提示用戶進行某些更改讓程序可以繼續(xù)運行下去。
C#編程語言本身就為我們提供了這種異常處理機制。
C#中的異常是對程序運行時出現(xiàn)的特殊情況的一種響應(yīng),比如嘗試除以零?;?/p>
者試圖將一個字符串〃aaa〃轉(zhuǎn)換成整數(shù)。
異常提供了一種把程序控制權(quán)從某個部分轉(zhuǎn)移到另一個部分的方式。C#異常處
理時建立在四個關(guān)鍵詞之上的:try、catch、finally和throwo
?try:一個try塊標(biāo)識了一個將被激活的特定的異常的代碼塊。后跟一個或多個catch
塊。
?catch:程序通過異常處理程序捕獲異常。catch關(guān)鍵字表示異常的捕獲。
?finally:finally塊用于執(zhí)行給定的語句,不管異常是否被拋出都會執(zhí)行。例如,如果
您打開一個文件,不管是否出現(xiàn)異常文件都要被關(guān)閉。
?throw:當(dāng)問題出現(xiàn)時,程序拋出一個異常。使用throw關(guān)鍵字來完成。
語法
假設(shè)一個塊將出現(xiàn)異常,一個方法使用try和catch關(guān)鍵字捕獲異常。
try/catch塊內(nèi)的代碼為受保護的代碼,使用"y/catch語法如下所示:
1try
2{
3//引起異常的語句
4)
5catch(ExceptionNameel)
6{
7//錯誤處理代碼
8)
9catch(ExceptionNamee2)
10(
n//錯誤處理代碼
12)
13catch(ExceptionNameeN)
14{
15//錯誤處理代碼
16}
17finally
18{
19//要執(zhí)行的語句
20)
C#提供了很多種異常,我們在這里只要掌握最基本的異常Exception就可以啦。
在catch語句中我們只處理Exception這個最基本的異常。
下面我們看一個具體的例子,來更加清楚的理解一下C#的異常處理。
你創(chuàng)建一個項目。解決方案名稱為Sloution22,項目名稱為Exercise22,項目
類型為控制臺程序。點擊Program,cs.在里邊加入這些代碼。
Program.es
▼月隼Exercise22.Program
1□usingSystem;
2usingSystem.Collections.Generic;
3usingSystem.Linq;
4usingSystem.Text:
5usingSystem.Threading.Tasks;
6
7-namespaceExercise22
8H
9BclassProgram
10{
11□staticvoidMain(string[]args)
12(
13try
14(
15ExceptionTest():
16Console.WriteLine("調(diào)用方法ExceptionTest成功“);
17)
18catch(Exceptione)
19{
20Console.WriteLine("調(diào)用ExceptionTest出現(xiàn)異?!?;
21Console.WriteLine("錯誤的簡要信息:"+e.Message);
22Console.WriteLine("詳細(xì)的錯誤信息:*+e.StackTrace);
23)
24Console.ReadLine();
25)
26
27staticvoidExceptionTest()
28{
29Console.WriteLine("清輸入一個整數(shù),按回車鍵結(jié)束:");
30stringinput=Console.ReadLine();
31intinputNumber:
32try
33{
34inputNumber=Convert.Tolnt32(input);
35)
36catch(Exception)
37{
38Console.WriteLine("ExceptionTest執(zhí)行出現(xiàn)異常"):
39thrownewExemption("轉(zhuǎn)換出現(xiàn)異常"):
40)
41finally
42{
43Console.WriteLine("ExceptionTest程序在finally語句中執(zhí)行“);
44)
45}
46}
47[1
48
我在這里簡要的說明一下這段代碼。
1.27行-45行我們新建了一個ExceptionTest方法。在這個方法中要求用戶
輸入一個整數(shù)。如果用戶輸入一個字符串,我們的程序會產(chǎn)生異常。
2.39行我們用throw拋出了一個我們自己定義的異常。在里邊加入了我們想
傳遞的一些信息。
3.41行-44行finally語句是可選的。只有當(dāng)需要做一些例如資源釋放的操作
的時候,才是需要的。不管有沒有異常產(chǎn)生finally部分都會執(zhí)行。
4.13行-23行調(diào)用ExceptionTest方法。同時捕獲異常。
5.16行如果調(diào)用ExceptionTest方法出現(xiàn)異常,這條語句不會執(zhí)行。否則正
常執(zhí)行。
6.21行輸出異常的簡要信息
7.22行輸出異常的詳細(xì)信息。例如出錯的代碼位置。
運行結(jié)果
1.用戶輸入字符串,產(chǎn)生異常
file:///E:/vs2013_prqjects/C^leaming/22/Solution22/Exercise22/bin/Debug/Exercise22,EXE
請輸入一個整數(shù),按回車鍵結(jié)束:
Ilikectt
ExceptionTest執(zhí)行出現(xiàn)異常_
ExceptionTest程序在finally語句中執(zhí)行
調(diào)用ExceptionTest出現(xiàn)異常
錯雋的面要信息:轉(zhuǎn)換由現(xiàn)異常
詳細(xì)的錯誤信息、:atExercise22.Program.ExceptionTest<>ine:\us2013_pi*ojects\C
learning\22\Solution22\Exercise22\Progran.cs:line39
atExercise22.Program.Main<Sti*ing[]args>ine:\us2013_projects\Cttlearning\22
\Solution22\Exei*cise22\Program.cs:line15
2.用戶輸入整數(shù),程序正常執(zhí)行
Eg:
看下面的程序段:
try(
returna/b;
}catch(Exceptione){
//當(dāng)b為0的時候這里可以打印提示:除數(shù)不能為0
)
異常的通俗原理在于,當(dāng)出現(xiàn)某些錯誤的時候,你又不想直接把程序直接關(guān)閉,那
么就在你捕捉到的異常里進行處理,這樣程序可以繼續(xù)運行,而不是馬上關(guān)閉.
上面你返回a/b,正常情況下b不是0,那么就直接返回,不會執(zhí)行catch里的東西,
但是當(dāng)你的b是0,就無法返回數(shù)據(jù),那么異常了,異常然后被catch捕捉到,就執(zhí)
行catch里的語句,然后繼續(xù)運行下面的代碼.
11、C#String.split()用法小結(jié)
第一種方法
strings=abcdeabcdeabcde;
string[]sArray=s.SplitCc);
foreach(stringiinsArray)
Console.WriteLine(i.ToStringO);
輸出下面的結(jié)果:
ab
deab
deab
de
第二種方法
我們看到了結(jié)果是以一個指定的字符進行的分割。使用另一種構(gòu)造方法對多個字
符進行分割:
strings=z/abcdeabcdeabcdez,;
string[]sArrayl=s.Split(newchar[3]{'c','d','e'});
foreach(stringiinsArrayl)
Console.WriteLine(i.ToStringO);
可以輸出下面的結(jié)果
ab
ab
ab
第三種方法
除了以上的這兩種方法以外,第三種方法是使用正則表達式。新建一個控制臺項
目。然后先添加usingSystem.Text.RegularExpressions;
System.Text.RegularExpressions
stringcontent=agcsmallmacsmallgggsmallytx;
string[]resultString=Regex.Split(content,small,RegexOptions.IgnoreCas
e)foreach(stringiinresultString)
Console.WriteLine(i.ToStringO);
輸出下面的結(jié)果:
age
mac
ggg
ytx
第四種方法
stringstrl=我*****是*****一******個*****教*****師;
string1]str2;
strl=strl.Replace(*****,*);
str2=strl.Split(*);
foreach(stringiinstr2)
Console.WriteLine(i.ToStringO);
第五種方法
stringstrl=我**是*****-******個*****教*****師;
我希望顯示的結(jié)果為:我是一個教師。
我如果采用上面的第四種方法來做就會產(chǎn)生下面的錯誤,我是一個教師。
中
間有空格輸出,所以輸出結(jié)果并不是希望的結(jié)果,這就又回到了正則表達式了
這時可以采用下面的第五種方法
stringstrl=我**是*****~******個*****教*****師;
string1]str2=
System.Text.RegularExpressions.Regex.Split(strl,;
foreach(stringiinstr2)
Console.WriteLine(i.ToStringO);
12、C#異常類相關(guān)總結(jié)
C#異常類一、基類Exception
C#異常類二、常見的異常類
1>SystemException類:該類是System命名空間中所有其他異常類的基
類。(建議:公共語言運行時引發(fā)的異常通常用此類)
2、ApplicationException類:該類表示應(yīng)用程序發(fā)生非致命錯誤時所
引發(fā)的異常(建議:應(yīng)用程序自身引發(fā)的異常通常用此類)
C#異常類三、與參數(shù)有關(guān)的異常類
此類異常類均派生于SystemException,用于處理給方法成員傳遞的參數(shù)
時發(fā)生異常
1、ArgumentException類:該類用于處理參數(shù)無效的異常,除了繼承來
的屬性名,此類還提供了string類型的屬性ParamName表示引發(fā)異常的
參數(shù)名稱。
2、FormatException類:該類用于處理參數(shù)格式錯誤的異常。
C#異常類四、與成員訪問有關(guān)的異常
1、MemberAccessException類:該類用于處理訪問類的成員失敗時所引
發(fā)的異常。失敗的原因可能的原因是沒有足夠的訪問權(quán)限,也可能是要訪問
的成員根本不存在(類與類之間調(diào)用時常用)
2、MemberAccessException類的直接派生類:
i、FileAccessException類:該類用于處理訪問字段成員失敗所引發(fā)的
異常
ii>MethodAccessException類:該類用于處理訪問方法成員失敗所引
發(fā)的異常
iii、MissingMemberException類:該類用于處理成員不存在時所引發(fā)
的異常
C#異常類五、與數(shù)組有關(guān)的異常
以下三個類均繼承于SystemException類
1、IndexOutOfException類:該類用于處理下標(biāo)超出了數(shù)組長度所引發(fā)
的異常
2、ArrayTypeMismatchException類:該類用于處理在數(shù)組中存儲數(shù)據(jù)
類型不正確的元素所引發(fā)的異常
3、RankException類:該類用于處理維數(shù)錯誤所引發(fā)的異常
C#異常類六、與10有關(guān)的異常
LIOException類:該類用于處理進行文件輸入輸出操作時所引發(fā)的異常。
2、lOException類的5個直接派生類:
i、DirectionNotFoundException類:該類用于處理沒有找到指定的目
錄而引發(fā)的異常。
ii、FileNotFoundException類:該類用于處理沒有找到文件而引發(fā)的
異常。
iii、EndOfStreamException類:該類用于處理已經(jīng)到達流的末尾而還
要繼續(xù)讀數(shù)據(jù)而引發(fā)的異常。
iv、FileLoadException類:該類用于處理無法加載文件而引發(fā)的異常。
v、PathTooLongException類:該類用于處理由于文件名太長而引發(fā)的
異常。
C#異常類七、與算術(shù)有關(guān)的異常
1、ArithmeticException類:該類用于處理與算術(shù)有關(guān)的異常。
2、ArithmeticException類的派生類:
i、DivideByZeroException類:表示整數(shù)貨十進制運算中試圖除以零而
引發(fā)的異常。
ii、NotFiniteNumberException類:表示浮點數(shù)運算中出現(xiàn)無窮打或
者非負(fù)值時所引發(fā)的異常。
13、C#中的Dictionary字典類介紹
說明
必須包含名空間System.Collection.Generic
Dictionary里面的每一個元素都是一個鍵值對(由二個元素組成:鍵和
值)
鍵必須是唯一的,而值不需要唯一的
鍵和值都可以是任何類型(比如:string,int,自定義類型,等等)
通過一個鍵讀取一個值的時間是接近0(1)
鍵值對之間的偏序可以不定義
使用方法:
〃定義
Dictionary<string,string>openWith=newDictionary<string,
string>();
〃添加元素
openWith.Add(〃txt〃,“notepad.exe〃);
openWith.Add(〃bmp〃,“paint.exe/z);
openWith.Add(〃dib〃,“paint.exe〃);
openWith.Add(〃rtf〃,/zwordpad.exe〃);
〃取值
Console.WriteLine(/zForkey=\〃rtf\〃,value={0}.z,,
openWith[z,rtf,z]);
〃更改值
openWith[,zrtfz/]="winword.exe”;
Console.WriteLine(z,F(xiàn)orkey=\〃rtf\〃,value={0}.〃,
openWith['rtrj);
〃遍歷key
foreach(stringkeyinopenWith.Keys)
(
Console.WriteLine(^Key={0}〃,key);
)
〃遍歷value
foreach(stringvalueinopenWith.Values)
{
Console.WriteLine(z,value={0}〃,value);
}
〃遍歷value,SecondMethod
Dictionary<string,string>.ValueCollectionvalueColl=
openWith.Values;
foreach(stringsinvalueColl)
(
Console.WriteLine(^SecondMethod,Value={0}z,,s);
〃遍歷字典
foreach(KeyValuePair<string,string>kvpinopenWith)
(
Console.WriteLine(Z/Key={0},Value={1}〃,kvp.Key,kvp.Value);
)
〃添加存在的元素
try
(
openWith.Add(〃txt〃,winword.exe〃);
}
catch(ArgumentException)
(
Console.WriteLine(^AnelementwithKey=\〃txt\〃already
exists.,z);
〃刪除元素
openWith.Remove("doc");
if(!openWith.ContainsKey("doc"))
(
Console.WriteLine(z,Key\"doc\"isnotfound.,z);
〃判斷鍵存在
if(openWith.ContainsKey("bmp"))//True
(
Console.WriteLine(z,AnelementwithKey=\"bmp\"exists./z);
參數(shù)為其它類型
〃參數(shù)為其它類型
Dictionary<int,string[]>OtherType=newDictionary<int,
string[]>();
OtherType.Add(1,"1,11,111”.Split
OtherType.Add(2,"2,22,222”.Split;
C
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年租賃代駕服務(wù)合同范本(含長途服務(wù)保障)3篇
- 2024試用銷售業(yè)務(wù)協(xié)議基本格式一
- 2025年度臨床試驗合同中的臨床試驗監(jiān)測與質(zhì)量保證措施2篇
- 2024年軟件開發(fā)優(yōu)先更新權(quán)協(xié)議3篇
- 2024裝修公積金貸款協(xié)議條款樣本版B版
- 2025年度大米加工企業(yè)技術(shù)改造投資合同樣本3篇
- 2024年高科技產(chǎn)業(yè)項目全額承包經(jīng)營合作協(xié)議3篇
- 2024年酒店大堂裝修項目施工協(xié)議版B版
- 2024煤炭居間經(jīng)紀(jì)業(yè)務(wù)合同模板6篇
- 2024年派遣員工保密協(xié)議
- 開放系統(tǒng)10861《理工英語(4)》期末機考真題及答案(第109套)
- SYT 0452-2021 石油天然氣金屬管道焊接工藝評定-PDF解密
- 2024年江蘇醫(yī)藥職業(yè)學(xué)院單招職業(yè)技能測試題庫及答案解析
- 醫(yī)院安全生產(chǎn)年終總結(jié)
- 2024年全國高考物理電學(xué)實驗真題(附答案)
- JB-T 14510-2023 活性污泥法一體化污水處理裝置
- 2024家長會安全教育
- 2024年度-全新事業(yè)單位內(nèi)部控制培訓(xùn)
- 天津市近幾年高考數(shù)學(xué)(文科)試卷知識點總結(jié)
- 護士培訓(xùn)課件:醫(yī)療護士法律法規(guī)應(yīng)知應(yīng)會
- 軟件度量與度量指標(biāo)的應(yīng)用
評論
0/150
提交評論