C#學(xué)習(xí)筆記(個人)_第1頁
C#學(xué)習(xí)筆記(個人)_第2頁
C#學(xué)習(xí)筆記(個人)_第3頁
C#學(xué)習(xí)筆記(個人)_第4頁
C#學(xué)習(xí)筆記(個人)_第5頁
已閱讀5頁,還剩149頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論