1 C#基礎(chǔ)知識(shí)1.1 簡介C#是一門純面向?qū)ο蟮男抡Z言,這門語言是專為.NET這個(gè)平臺(tái)開發(fā)的,。它不僅是語言,,也是.NET平臺(tái)不可缺少的組成部份。C#提高了安全性,,同時(shí)還支持組件對象模型(COM)和基于Windows的API,。C#還允許有限制的使用本機(jī)指針。 本章主要探討C#中的基本編程構(gòu)造和基本數(shù)據(jù)類型,,簡單說說裝箱和取消裝箱的概念,,最后講下怎樣編寫和編譯簡單的C#程序。 1.2 C#程序的基本流程請研究下面的示例1,這是一個(gè)使用C#編寫的“Hello World”程序,,運(yùn)行后將會(huì)在屏幕上顯示出“Hello World”?,F(xiàn)在我們來分析這個(gè)程序。 示例1: /*這是我的第一個(gè)C#程序*/ using System; class myFirst { public static void Main() { Console.WriteLine(“Hello World”); } } 第一行:此行為注釋,,注釋以“/*”開頭,,以“*/”結(jié)尾。注釋可以包含多個(gè)行,。 第二行:using System;些行與C/C++中的#include語句非常相似,。在這里using是導(dǎo)入指令,System是命名空間,。我們可以將命名空間視為一組類,,System類是所有類的基類,包含大多數(shù)應(yīng)用程序與操作系統(tǒng)進(jìn)行交第操作時(shí)所需要用到的類,。請注意C#每條語句后都有一個(gè)“;”號(hào),。C#中的所有代碼行都必須以分號(hào)結(jié)尾。 第三行:class myFirst中的class是關(guān)鍵字,,代表我們定義了一個(gè)類,,這個(gè)類的名字叫做myFirst?;菊Z法class<name>{},,“{”與“}”之間為類的作用域,為了養(yǎng)成良好的編程習(xí)慣,,在定義類以后就跟上{},,以免忘記。 第五行:public static void Main()函數(shù)是C#程序的入口點(diǎn),,我們也稱為主函數(shù),。即,程序開始執(zhí)行后首先調(diào)用的函數(shù)是Main()函數(shù),。Public訪問修飾符代表此函數(shù)聲明為公共作用域,,因此可以從程序中的任何位置對它進(jìn)行訪問。static為靜態(tài)成員(稍后章節(jié)我們會(huì)對它進(jìn)行詳細(xì)的討論),void代表此函數(shù)不返回任何值,。特別注意C#是嚴(yán)格區(qū)分大小寫,。在此行代碼中所有關(guān)鍵字都使用小寫字母,只有Main()函數(shù)的首字母大寫,。例如:using與Using是完全不同的,。 第七行:這一行為主函數(shù)的內(nèi)容,我們也用{}把它們包含在這個(gè)主函數(shù)的作用域中,,Console.WriteLine(“Hello World”);調(diào)用了Console類中的WriteLine方法,并將文本“Hello World”作為參數(shù)傳遞。WriteLine函數(shù)將文本顯示在控制臺(tái)或DOS窗口中,。請注意:Console是屬于System命名空間,。如果我們沒有導(dǎo)入命名空間,即沒有寫using System;那么我們將以下列方式實(shí)現(xiàn)文本打印,。 System.Console.WriteLine(“Hello Word”); 那么我們?yōu)槭裁匆A(yù)先導(dǎo)入命名空間呢,?因?yàn)槭褂猛耆薅Q表示對象可能很乏味,而且易引發(fā)錯(cuò)誤,。為了減輕這一負(fù)擔(dān),,C#提供了using指令。一個(gè)程序中可以導(dǎo)入多個(gè)命名空間,,但必須在文件頭部指定,。 以上程序只用于幫助理解C#中的程序執(zhí)行的基本流程。本章后面的部份將更細(xì)的討論C#,。 1.3 C#中的變量聲明C#中的變量聲明格式: AccessModifer DataType VariableName; AccessModifer:訪問修飾符 DataTyep:變量類型 AriableName:變量名 各修飾符的訪問級(jí)別如表1.1 表1.1:C#的訪問修飾符
表1.2:C#數(shù)據(jù)類型
變量命名 示例2: using System; class Test { static void Main() { string @string() @string=“此例中string是一個(gè)關(guān)鍵字,但在本例中作用一個(gè)變量名”; Console.WriteLine(@string); } } 注意:上面的示例中聲明了一個(gè)string類型的變量,,因?yàn)閟tring是關(guān)鍵字,,所以我們在變量前加上前綴@以表示這是一個(gè)變量名。 與C#中的變量相關(guān)的另一功能是,,創(chuàng)建靜態(tài)變量,、類實(shí)例變量和數(shù)組元素時(shí),會(huì)自動(dòng)為其指定一個(gè)默認(rèn)值,。請研究下列示例: 示例3: using System; class Test { static void Main() { int[] array1 = new int[5]; Console.WriteLine (10 * array1[2]); } } 以上示例輸出為0 表1.3:數(shù)據(jù)類型及其默認(rèn)值
對于所有其它變量,,編譯器將引發(fā)錯(cuò)誤,。因此,在編程的時(shí)候盡量在使用變量前就為其賦值,。 1.4 C#中的基本輸入與輸出在執(zhí)行C#的基本輸入和輸出的操作時(shí),,需要使用System命名空間的Console類的方法。 兩個(gè)最常用的方法如下所示,。 Console.WriteLine() Console.ReadLine() 示例1中已經(jīng)使用了Console.WriteLine,。但是Console.WriteLine的功能十分強(qiáng)大,可以用它在顯示文本之前設(shè)置文本的格式,。它還帶有附加參數(shù),、占位符,指定顯示方式,。 請仔細(xì)研究下面的示例4,。 示例4: using System; class Teest { static void Main() { int number,result; number=5; result=100 * number; Console.WriteLine(“數(shù)字100乘上{0}時(shí),,結(jié)果為{1}”,number , result); } } 示例輸出為:數(shù)字100乘上5時(shí),結(jié)果為500 示例5使用Console.ReadLine() 示例5: using System class InputStringTest { static void Main() { string input; Console.WriteLine(“請輸入數(shù)字:”); input=Console.ReadLine(); Console.WriteLine(“{0}”,input); } } 示例5中的ReadLine()方法可讀取回車符之前的所有字符,。輸入將以字符串的形式返回,。 1.5 C#中的判斷語句C#中的條件檢查與C中相同,可以使用if結(jié)構(gòu)執(zhí)行條件分支,。請記住,,C#語法中,條件永遠(yuǎn)都是boolean值語法如下: If(expreession) { //表達(dá)式的結(jié)果為true時(shí)執(zhí)行的語句 } else { //表達(dá)式的結(jié)果為false時(shí)執(zhí)行的語句 } 代碼段1: string str=”條件換算”; if(str) { System.Console.WriteLine(“判斷值為True”); } if(str = = “條件換算”) { System.Console.WriteLine(“判斷值為 True”); } else { System.Console.WriteLine(“判斷值為 False”); } 當(dāng)編譯遇到第一個(gè)if語句時(shí),,將生成下列錯(cuò)誤: 錯(cuò)誤CS0029:無法將類型“string” 隱式轉(zhuǎn)換為 “bool” 這個(gè)錯(cuò)誤的原因是第一個(gè)if語句的表達(dá)式str的計(jì)算結(jié)果不是Boolean值,。 swich結(jié)構(gòu)的語法如下: switch(weekday) { case 1: Console.WriteLine(“星期一”); break; case 2: Console.WriteLine(“星期二”); break; case 3: Console.WriteLine(“星期三”); break; default: Console.WriteLine(“默認(rèn)星期日”); break; } 以上語法與C基本想同,只有一個(gè)增強(qiáng)功能,,它允許將switch結(jié)構(gòu)與字符串一起使用,。 1.6 C#中的循環(huán)結(jié)構(gòu)(也稱迭代結(jié)構(gòu))C#提供了下列循環(huán)結(jié)構(gòu)類型。 while循環(huán) do循環(huán) for循環(huán) foreach循環(huán) 除foreach循環(huán)外,,其它的所有類型都與C中的相應(yīng)類型相似,。以下為各種循環(huán)結(jié)構(gòu)的解釋。 while循環(huán) while循環(huán)執(zhí)行一組語句,,直至指定的條件為false為止,。循環(huán)條件要求boolean條件。 語法如下: while(condition) { //語句 } 可在while循環(huán)中指定break語句跳出循環(huán),。continue語句可用于跳過當(dāng)前這次循環(huán)進(jìn)入下一次循環(huán),。 do循環(huán) do循環(huán)與while循環(huán)非常相似,不同之處是在while循環(huán)中,首先計(jì)算條件,然后執(zhí)行語句,,而在do循環(huán)中,,條件是在循環(huán)第一次結(jié)束時(shí)計(jì)算的。在do循環(huán)中,,至少要執(zhí)行一次循環(huán)才會(huì)檢查條件,。語法如下: do { //語句 }while(condition) break和continue語句也可以用在do循環(huán)中。 for循環(huán) for循環(huán)與其它的循環(huán)區(qū)別不大,。循環(huán)變量可以作為for語句的一部份進(jìn)行聲明,。 語法如下: for(intialization;condition;increment/decrement) { //語句 } 例子: for( int i ; i <=1;i++) { Console.WriteLine(i); } 變量必須是整型 foreach循環(huán) foreach循環(huán)是C#中嫁接自VB的概念,該結(jié)構(gòu)常用于能通過集合或數(shù)組來循環(huán),。 語法如下: foreach(Type Identifier in expression) { //語句 } 請仔細(xì)研究下面的示例6: 示例6: using System; public class ForEachLoop { static void Main (String [] args) { int index; String [] array1=new String [3]; For (index=0;index<3;index++) { array1[index]=args[index]; } foreach (String strName in array1) { Console.WriteLine (strName); } } } 輸入?yún)?shù)one two ABC得到one two ABC for循環(huán)通過數(shù)組args循環(huán),并將其中包含的值指定給數(shù)組array1,。然后foreach循環(huán)通過數(shù)組array1循環(huán),并將其中所包含的值一次一個(gè)的指定給變量strName,。 1.7 C#的構(gòu)造函數(shù)構(gòu)造函數(shù)是特殊的方法,,與包含它們的類同名。創(chuàng)建類實(shí)例時(shí),,首先執(zhí)行構(gòu)造函數(shù),。下面是語法,。 … class MyConstructorEx { public MyConstructorEx() { //MyConstructorEx構(gòu)造函數(shù) } } … C#中的析構(gòu)函數(shù) C#中的析構(gòu)函數(shù)與構(gòu)造函數(shù)的編寫方式相同,它們與類同名,,不同之外是有一個(gè)顎化(~)符號(hào)作為前綴,。那么什么時(shí)候會(huì)執(zhí)行析構(gòu)函數(shù)呢,?在類的實(shí)例被刪除或超出程序的作用域時(shí),,將執(zhí)行析構(gòu)函數(shù)。 代碼段4: … class MyConstructorEx { public MyConstructorEx() { //MyConstructorEx構(gòu)造函數(shù) } public ~MyConstructorEx() { //~MyConstructorEx析構(gòu)函數(shù) } } … 注意:C#中的析構(gòu)函數(shù)雖然與C++中的定義相同,,但是行為不同,,C#中它們由垃圾回收器調(diào)用。垃圾回收器是CLR(.NET運(yùn)行庫)的一種服務(wù),。 1.8 C#中數(shù)據(jù)類型的分類C#中的數(shù)據(jù)類型分為兩個(gè)基本類別,,即值類型和引用類型。值類型表示實(shí)際數(shù)據(jù),,存儲(chǔ)在堆棧中,,而引用類型則表示指向該數(shù)據(jù)的指針或引用,存儲(chǔ)在堆上,。Int,char,結(jié)構(gòu)等都是值類型,。類、接口,、數(shù)組和字符串都是引用類型,。 Using System; Class DataTypeTest { static void Main() { int variableVal=100; funcTest(variableVal); Console.WriteLine(variableVal); } static void funcTest(int variableVal) { int tempVar=10; variableVal=tempVar * 20; } } 輸出結(jié)果為:100 因?yàn)樽兞縱ariableVal的值在函數(shù)funcTest()中被修改后,沒有反應(yīng)到Main()函數(shù),。出現(xiàn)這種情況是因?yàn)閕nt為值類型,,因此當(dāng)傳遞至函數(shù)funcTest()時(shí),僅傳遞一個(gè)變量的值的副本,。 示例8: using System; class DataTypeTest { public int variableVal; } class DataTypeTestRef { static void Main() { DataTypeTest dataTest=new DataTypeTest(); dataTest.variableVal=100; funcDataTypeTest(dataTest); Console.WriteLine(dataTest.variableVal); } static void funcDataTypeTest(DataTypeTest dataTest) { int tempVar=10; dataTest.variableVal=tempVar * 20; } } 輸出結(jié)果:200 這是因?yàn)檫@一次傳遞至函數(shù)的參數(shù)是一個(gè)對象,。這個(gè)對象屬于引用類型,因此傳遞該對象時(shí),,傳弟的是對象的引用(也稱地址),,而不是其值的副本。所在以函數(shù)內(nèi)所做的修改會(huì)反應(yīng)到Main()函數(shù),。 表 3.4 數(shù)值數(shù)據(jù)類型和引用數(shù)據(jù)類型的常見特征
從3.4表中可以看出: 值類型的變量保存實(shí)際值,,而引用類型的變量則保存對象的地址。 值類型內(nèi)存分配在堆棧上,,而引用類型的則分配在堆上,。 前面部分中曾講到C#會(huì)為變量分配一個(gè)默認(rèn)值。值類型的默認(rèn)值為零,,而引用類型的默認(rèn)值為null引用,。 對值類型執(zhí)行“=”運(yùn)算會(huì)將值復(fù)制至目標(biāo)變量,,而引用類型執(zhí)行同一運(yùn)算則會(huì)將對像的引用復(fù)制至目標(biāo)。 1.8.1 裝箱和取消裝箱簡單的說,,裝箱就是從值類型到引用類型的轉(zhuǎn)換,。同樣,取消裝箱便是從引用類型到值類型的轉(zhuǎn)換,。這是C#非常強(qiáng)大的一個(gè)功能,。可以讓你像簡單的操作值類型一樣操作復(fù)雜的引用類型,。這對于實(shí)現(xiàn)多態(tài)性非常重要,。 我們來研究下概念,看看代碼段5,。 代碼段5: … class BoxEx { int objsTaker(object objectX) { //objsTaker接收一個(gè)對象 //并在此處對其進(jìn)行處理 } object objsConverter() { //objsConverter執(zhí)行處理過程 //并返回對象 } } … //代碼實(shí)現(xiàn) int variable1; variable1=5; boxVar.objsTaker(variable1);//第1行 int convertVar=(int)boxVar.objsConverter();//第2行 … 上面定義了一個(gè)包含兩個(gè)方法的類,。第一個(gè)方法objsTaker()將一個(gè)對象作為其參數(shù)。第二個(gè)方法variable1的int型值類型變量,,并賦值勤5,,創(chuàng)建了一個(gè)類BoxEx的新對象boxVar。在指定為“第一行”的行中,,調(diào)用了objsTaker()方法并將variable1作為參數(shù)傳遞,。請注意,objsTaker方法使用的一個(gè)對象作為其參數(shù),。對象是引用類型,,而程序中是將值類型的variable1作為參數(shù)傳弟。通常情況下這樣會(huì)產(chǎn)生錯(cuò)誤,,但在C#中,,值類型variable1將被隱式轉(zhuǎn)換為引用類型。這個(gè)值類型轉(zhuǎn)換為引用類型的過程(無論是隱式還是顯式)即稱為“裝箱”,。在接下來的標(biāo)記為“第2行”的行中,,創(chuàng)建了一個(gè)新的名為convertVar的int型變量,然后對該變量與objsConverter方法執(zhí)行相等運(yùn)算,。ObjsConverter()不帶參數(shù),,但返回一個(gè)對象。由于將方法int類型的值類型變量進(jìn)行了賦值運(yùn)算,,因此必須將此對象顯式地轉(zhuǎn)換為int類型(轉(zhuǎn)換是通過將所需的數(shù)據(jù)類型括到圓括號(hào)中來完成的),。這個(gè)將引用類型轉(zhuǎn)換為值類型的過程我們稱為“取消裝箱”。 特別需要注意的是,,取消裝箱需要進(jìn)行顯式的轉(zhuǎn)換,。運(yùn)行庫將執(zhí)行檢查,以確保指定值類型與引用類型中包含的類型匹配,。如果此檢查失敗,,將引發(fā)異常,,而如果該異常沒有得到妥善處理,應(yīng)用程序?qū)⒔K止,。 1.9 數(shù)據(jù)類型處理C#提供了一個(gè)“統(tǒng)一類型系統(tǒng)”,。也就是說,C#中的所有數(shù)據(jù)類型(引用類型或值類型)都是從一個(gè)類(object類)派生而來的,。這意味著,,C#中的一切全都是對象(因?yàn)樗蓄愋投际莖bject類的派生物)。 下面我們來闡釋這一點(diǎn),。 示例9: using System; class ObjectProff { static void Main() { string objectVal; objectVal=7.ToString(); Console.WriteLine(“該值現(xiàn)在是”+objectVal); } } 此示例輸出結(jié)果是:該值現(xiàn)在是7 請注意粗體顯示部份,,7是一個(gè)數(shù)字,如果是一個(gè)字符串,,那么我們應(yīng)該用雙引號(hào)把它引起來。這里沒引,,說明一個(gè)整型,。為何數(shù)字可以擁有方法。在C#,,一切都是對象,,即便是數(shù)字7也被認(rèn)為是對象。因此,,它可以擁有方法,,而ToString()就是方法之一。此方法是將數(shù)字7轉(zhuǎn)換為字符串值,。 C#的另一個(gè)激動(dòng)人心的功能:由于所有類型都是由共同的一個(gè)類,,object 類派生而來,因此他們具有一些相同的特征,。 1.10 C#中的靜態(tài)成員某此情況下,,需要在類中定義這樣的成員:這些成員不與任何其他特定對象相關(guān)聯(lián)(類本身除外)。也就是說,,無論有多少該類的對象,,只會(huì)有此方法/字段的一個(gè)實(shí)例。在C#中可以使用關(guān)鍵字static定義靜態(tài)成員,,如下代碼所示: 代碼段6: … static int staticMem; … static int instanceCount() { //instanceCount實(shí)現(xiàn) } … 1.11 數(shù)組數(shù)組是一組具有類似數(shù)據(jù)類型的值,。這些值存儲(chǔ)在相鄰的內(nèi)存位置,因此訪問和操縱這些值更為簡便,。數(shù)組下標(biāo)由零開始,,C#中的數(shù)組屬于引用類型,因此存儲(chǔ)在堆中,。語法如下: DataTyep[number of elements] variableName; 下面的代碼段顯示了一個(gè)數(shù)組聲明示例,。 代碼段7: … int[6] array1 … 此示例聲明了一個(gè)名為array1的整型類型數(shù)組,該數(shù)組包含6個(gè)元素,。 代碼段8: … string[] array2; array2 = new string[5]; … 該示例表明,數(shù)組中元素的個(gè)數(shù)可在程序中稍后部份指定,。 代碼段9: … string[] array3 = {“top”, “down”,“l(fā)eft”,“right” }; … 該示例表明,,可以在聲明階段進(jìn)行數(shù)組初始化。 1.12 結(jié)構(gòu)可以使用類來實(shí)現(xiàn)對象,。但某些情況下,,可能需要使對象具有內(nèi)置數(shù)據(jù)類型的行為,以加快分配,,避免過多重載和引用開銷,。這個(gè)問題可以通過使用結(jié)構(gòu)來解決。結(jié)構(gòu)與類很相似,,都表示可以包含數(shù)據(jù)成員和函數(shù)成員的數(shù)據(jù)結(jié)構(gòu),。與類不同的是,結(jié)構(gòu)是值類型并且不需要堆分配,。結(jié)構(gòu)類型的變量直接包含結(jié)構(gòu)結(jié)構(gòu)的數(shù)據(jù),,而類類型的變量包含對數(shù)據(jù)的引用(該變量稱為對象)。C#的結(jié)構(gòu)內(nèi)可以定義方法,,并且還可以有一個(gè)構(gòu)造函數(shù),。 類與結(jié)構(gòu)有很多相似之處:結(jié)構(gòu)可以實(shí)現(xiàn)接口,并且可以具有與類相同的成員類型,。然而,,結(jié)構(gòu)在幾個(gè)重要方面不同于類:結(jié)構(gòu)為值類型而不是引用類型,并且結(jié)構(gòu)不支持繼承,。結(jié)構(gòu)的值存儲(chǔ)在“在堆棧上”或“內(nèi)聯(lián)”,。 下面我們來研究一下下面的代碼段: 代碼段10: … struct structEx { public int structDataMember; public void structEx() { //構(gòu)造函數(shù)實(shí)現(xiàn) } public void structMethod1() { //structMethod1實(shí)現(xiàn) } } … 上面代碼段所示,名為structEr的結(jié)構(gòu)中有一個(gè)構(gòu)造函數(shù),、一個(gè)方法和一個(gè)數(shù)據(jù)成員,。結(jié)構(gòu)也有自己的局限性,它們不能像類那樣實(shí)現(xiàn)繼承,。更為重要的是,,結(jié)構(gòu)是值類型,而類則是引有類型,。在C#中,,值類型實(shí)際是屬于System命名空間的結(jié)構(gòu)。例如:long類型是System.Int64結(jié)構(gòu)的別名,。也就是說,,使用簡單類型時(shí),實(shí)際上是在使用基類中的結(jié)構(gòu)。 例如,,將 Point 定義為結(jié)構(gòu)而不是類在運(yùn)行時(shí)可以節(jié)省很多內(nèi)存空間,。下面的程序創(chuàng)建并初始化一個(gè) 100 點(diǎn)的數(shù)組。對于作為類實(shí)現(xiàn)的 Point,,出現(xiàn)了 101 個(gè)實(shí)例對象,,因?yàn)閿?shù)組需要一個(gè),它的 100 個(gè)元素每個(gè)都需要一個(gè),。 class Point { public int x, y; public Point(int x, int y) { this.x = x; this.y = y; } } class Test { static void Main() { Point[] points = new Point[100]; for (int i = 0; i < 100; i++) points = new Point(i, i*i); } } 如果將 Point 改為作為結(jié)構(gòu)實(shí)現(xiàn),,如 struct Point { public int x, y; public Point(int x, int y) { this.x = x; this.y = y; } } 則只出現(xiàn)一個(gè)實(shí)例對象(用于數(shù)組的對象)。Point 實(shí)例在數(shù)組中內(nèi)聯(lián)分配,。此優(yōu)化可能會(huì)被誤用,。使用結(jié)構(gòu)而不是類還會(huì)使應(yīng)用程序運(yùn)行得更慢或占用更多的內(nèi)存,因?yàn)閷⒔Y(jié)構(gòu)實(shí)例作為值參數(shù)傳遞會(huì)導(dǎo)致創(chuàng)建結(jié)構(gòu)的副本,。 1.13 枚舉類型枚舉類型是聲明一組命名常數(shù)的獨(dú)特類型,。當(dāng)程序中某些數(shù)值可以具有一組特定值時(shí),可以使用枚舉類型,。假設(shè)需要使程序僅接受五個(gè)值,,例如:Monday、Tuesday,、Wednesday、Thursday和Friday作為Weekdays的值,。要強(qiáng)制實(shí)現(xiàn)此要求,,僅需要指定包含指定值的枚舉類型Weekdays,并編寫一個(gè)僅接受此枚舉數(shù)作為參數(shù)的方法,。下段的代碼段對此進(jìn)行了說明,。 代碼段11: … public class Holiday { public enum WeekDays { Monday, Tuesday, Wednesday, Thursday, Friday } public void GetWeekDays (String EmpName,WeekDays DayOff) { //處理WeekDays … } static void Main() { Holiday myHoliday = new Holiday(); MyHoliday.GetWeekDays(“Richie”,Holiday.WeekDays.Wednesday); } } … 與C一樣,C#中的枚舉數(shù)擁有與值關(guān)聯(lián)的數(shù)字,。默認(rèn)情況下,,向枚舉數(shù)的第一個(gè)元素賦值0,而其后各個(gè)元素的值較前一個(gè)元素的值都遞增1。不過這些值可以重寫,,并且可以在初始化階段指定其他的值,。 代碼段12: … public enum WeekDays { Monday=1, Tuesday=2, Wednesday=3, Thursday=4, Friday=5 } … 1.14 編譯和執(zhí)行C#程序首先要運(yùn)行C#程序必須要有C#運(yùn)行的環(huán)境。即安裝Microsoft .NET Framework SDK v1.1或以上版本,。 csc.exe是.net用來編譯.cs文件的,,但必須要在安裝目錄下使用。 所以我們要設(shè)置一下環(huán)境變量,。 C#環(huán)境變量設(shè)置: 1,、在桌面右擊[我的電腦]->[屬性]->[高級(jí)]->[環(huán)境變量] 2、在下面的系統(tǒng)變量欄點(diǎn)擊“新建” 3、變量名輸入“csc” 4,、變量值輸入:“C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\” (2000是C:\WINNT\Microsoft.NET\Framework\v1.1.4322\) 5,、然后在系統(tǒng)變量列表框中雙擊“Path” 6、在變量名文本框的最后面加入 ; “%csc%” 恩,,現(xiàn)在可以在任意目錄下調(diào)試.cs文件了,。 下面給出命令行示例 編譯 File.cs 以產(chǎn)生 File.exe: csc File.cs 編譯 File.cs 以產(chǎn)生 File.dll: csc /target:library File.cs 編譯 File.cs 并創(chuàng)建 My.exe: csc /out:My.exe File.cs 通過使用優(yōu)化和定義 DEBUG 符號(hào),編譯當(dāng)前目錄中所有的 C# 文件,。輸出為 File2.exe: csc /define:DEBUG /optimize /out:File2.exe *.cs 編譯當(dāng)前目錄中所有的 C# 文件,,以產(chǎn)生 File2.dll 的調(diào)試版本。不顯示任何徽標(biāo)和警告: csc /target:library /out:File2.dll /warn:0 /nologo /debug *.cs 將當(dāng)前目錄中所有的 C# 文件編譯為 Something.xyz(一個(gè) DLL): csc /target:library /out:Something.xyz *.cs 編譯 File.cs 以產(chǎn)生 File.dll: csc /target:library File.cs這個(gè)就是我們使用最多的一個(gè)命令,,其實(shí)可以簡單的寫成csc /t:library File.cs,,另外的一個(gè)寫法是 csc /out:mycodebehind.dll /t:library mycodebehind.cs,這個(gè)可以自己指定輸出的文件名,。 csc /out:mycodebehind.dll /t:library mycodebehind.cs mycodebehind2.cs,,這個(gè)的作用是把兩個(gè)cs文件裝到一個(gè).dll文件里,很有用哦,。 1.15 小結(jié)C#變量的聲明方式如下: AccessModifier DataType VariableName; C#中,,通過添加前綴@符號(hào),可以將關(guān)鍵字用作變量名稱,。此@符號(hào)不是標(biāo)識(shí)符的一部份,。 在C#,靜態(tài)變量,、類實(shí)例變量和數(shù)組元素在創(chuàng)建時(shí)自動(dòng)賦值,。 選擇語句可用于根據(jù)表達(dá)式的值執(zhí)行各種操作。 C#中的swhitch語句要求為每個(gè)case塊都使用一個(gè)break語句,。 C# 允許將switch結(jié)構(gòu)與字符串一起使用,。 C# 提供了下列循環(huán)結(jié)構(gòu)類型: while循環(huán) do循環(huán) for循環(huán) foreach循環(huán) 在C#中,數(shù)據(jù)類型分為兩種基本類型,,即值類型和引用類型,。 在C#中,多數(shù)基本數(shù)據(jù)類型(如 int,、char),,包括結(jié)構(gòu)在內(nèi),為值類型,。引用類型包括類,、接口、數(shù)組和字符串,。 裝箱是指從值類型到引用類型的轉(zhuǎn)換,,而取消裝箱是指從引用類型到值類型的轉(zhuǎn)換。 C#中的所有數(shù)據(jù)類型都是從一個(gè)類即object類派生而來的。 C#結(jié)構(gòu)內(nèi)部可以定義方法,,也可以擁有構(gòu)造函數(shù),。 枚舉類型是聲明一組命名常數(shù)的獨(dú)特類型。 1.16 練習(xí)1. C#中的標(biāo)識(shí)符可以是保留關(guān)建了,。 a.對 b.錯(cuò) 2. ___________方法用于接受用戶輸入,。 a.Console.Read b.Console.RealdLine c.Console.WriteLine 3. 在C#中,if結(jié)構(gòu)始終要求條件的計(jì)算結(jié)果為boolean類型,。 a.對 b.錯(cuò) 4. 值類型存儲(chǔ)于____________________,。 a.堆棧 b.堆 c.隊(duì)列 5. 與C/C++不同,C#允許結(jié)構(gòu)擁有____________,。 a.僅構(gòu)造函數(shù) b.方法和構(gòu)造函數(shù) 1.17 作業(yè)編寫C#程序,,實(shí)現(xiàn)下列目的: 1. 顯示一條消息,要求用戶輸入自己的姓名,、雇員編號(hào)和部門,。接受輸入的值并顯示在屏幕上。(提示:使用多個(gè)變量存儲(chǔ)這些值,。) 2. 修改上面的程序,,以下列方式顯示這些值。如果輸入的值為Samuel,、7576和HR,,則輸出應(yīng)為:HR部門的Samuel的雇員編號(hào)為7576。 3. 在上述程序中,,接受用戶輸入的值作為命令行參數(shù),。對命令行參數(shù)編號(hào)并將其顯示在屏幕上。 假如,,假設(shè)用戶在<Filename>中輸入:Samuel 7576 HR 則輸出應(yīng)為 1:Samuel 2:7576 3:HR 4. 在屏幕上顯示下面的項(xiàng)列表: 1. 加 2. 減 3. 乘 4. 除 接受用戶提供的三個(gè)integer值。前兩個(gè)integer值為數(shù)字,,按照用戶的選擇對其進(jìn)行數(shù)學(xué)運(yùn)算,,第三個(gè)integer值為用戶要執(zhí)行的數(shù)學(xué)運(yùn)算。此值不能小于1且不能大于4,。根據(jù)用戶的選擇(用戶提供的第三個(gè)interger值)執(zhí)行下列運(yùn)算,。 如果此值為 則執(zhí)行 加 將前兩個(gè)integer值相加,并顯示結(jié)果 減 從第一個(gè)integer值減去第二個(gè)integer值,,并顯示結(jié)果 乘 將前兩個(gè)integer值相乘,,并顯示結(jié)果 除 用第二個(gè)integer除第一個(gè)integer,并顯示結(jié)果 提示:使用switch結(jié)構(gòu)或多個(gè)if 語句 5. 編寫一個(gè)結(jié)構(gòu),,以華氏和攝氏的形式存儲(chǔ)溫度,。編寫一個(gè)函數(shù),轉(zhuǎn)換溫度表示形式,如從華氏溫度轉(zhuǎn)換為攝氏溫度,。
|
|