ASP.NET基礎(chǔ)教程:C#與JAVA的比較
簡(jiǎn)單地說(shuō),它們不是一種語(yǔ)言,語(yǔ)法有差別,編程時(shí)具體用到的類庫(kù)或者函數(shù)庫(kù)也不一樣。
雖然它們不是一種語(yǔ)言,不過(guò)它們卻也有所聯(lián)系。廣泛地說(shuō),C可以看作其他三種語(yǔ)言的源語(yǔ)言,因?yàn)槠渌N語(yǔ)言幾乎都是從C而來(lái)的,無(wú)論從數(shù)據(jù)類型還是控制語(yǔ)句看,其他三種語(yǔ)言都有從C得來(lái)的跡象。 其中C++則一般看作是對(duì)C語(yǔ)言的擴(kuò)展。因?yàn)椋谜Z(yǔ)言沒(méi)有面向?qū)ο蟮恼Z(yǔ)法結(jié)構(gòu),而當(dāng)時(shí)業(yè)界又迫切需要面向?qū)ο蟮木幊烫匦裕载悹枌?shí)驗(yàn)室的開(kāi)發(fā)者就為C添加了面向?qū)ο蟮慕Y(jié)構(gòu)?,F(xiàn)在C++已經(jīng)不只是C的擴(kuò)展了,它已經(jīng)完全可以被看作一種新的編程語(yǔ)言。雖然C的特性以及庫(kù)函數(shù)仍然被C++支持,不過(guò)C++擁有自己的獨(dú)立的類庫(kù)體系,功能相當(dāng)強(qiáng)大。 Java語(yǔ)言是一種完全的面向?qū)ο笳Z(yǔ)言,雖然它的底層(運(yùn)行時(shí)庫(kù))是用C語(yǔ)言開(kāi)發(fā)的,可是并不依賴于C。因?yàn)椋剩幔觯岬倪\(yùn)行是在運(yùn)行時(shí)庫(kù)的支持下進(jìn)行的,所以運(yùn)行效率比起可以更接近底層的C/C++來(lái)說(shuō)效率會(huì)有所影響,不過(guò)Java的類庫(kù)采用很好的設(shè)計(jì)理念設(shè)計(jì),非常好用,也非常實(shí)用,已經(jīng)成為業(yè)界的一種標(biāo)準(zhǔn)開(kāi)發(fā)語(yǔ)言。它的跨平臺(tái)的特性尤其讓很多開(kāi)發(fā)者歡迎,你只需要開(kāi)發(fā)一次就能在所有安裝了Java運(yùn)行時(shí)庫(kù)的系統(tǒng)上運(yùn)行。Java發(fā)展了十幾年了,可以應(yīng)用領(lǐng)域非常之廣泛,Web開(kāi)發(fā)有JSP,J2EE,桌面領(lǐng)域現(xiàn)在有JavaFX。 ?。茫J俏④涢_(kāi)發(fā)的一種編程語(yǔ)言,語(yǔ)法類似Java,幾乎就是從Java的翻版。運(yùn)行原理和Java也類似,也是通過(guò)運(yùn)行時(shí)庫(kù)的支持運(yùn)行。不過(guò)支持的平臺(tái)還很有限。JAVA幾乎被所有平臺(tái)支持,而C#目前只被Windows和Linux支持,Windows下的支持當(dāng)然是由微軟自己開(kāi)發(fā)的,而Linux下的支持則有MONO支持。實(shí)際上,MONO也是把C#應(yīng)用轉(zhuǎn)化為JAVA應(yīng)用而已,所以本質(zhì)上,C#仍然只是被微軟自己的操作系統(tǒng)支持。應(yīng)用平臺(tái)受到限制,是它最大的缺點(diǎn)。 C/C++的優(yōu)點(diǎn)在于與底層比較接近,可以控制的粒度更加精細(xì),是開(kāi)發(fā)系統(tǒng)級(jí)應(yīng)用的最佳選擇。關(guān)于缺點(diǎn),我想正是源于其優(yōu)點(diǎn),因?yàn)樗鼈兡芸刂频木幊淘亓6染?xì),所以編程比較困難,煩瑣,容易出錯(cuò)。 ?。剩幔觯岷停茫6急容^高級(jí),可以看作高級(jí)語(yǔ)言的高級(jí)語(yǔ)言,優(yōu)點(diǎn)是開(kāi)發(fā)容易,但運(yùn)行效率不如更為底層的C/C++。 具體選擇使用的時(shí)候,可以根據(jù)實(shí)際的項(xiàng)目需要選擇。運(yùn)行效率要求高的,底層控制要求高的用C/C++,否則可以選擇Java或C#;跨平臺(tái)的要求高的可以用Java。 關(guān)于跨平臺(tái),C/C++也是很好的語(yǔ)言,因?yàn)樗衅脚_(tái)都支持,不同的是,不同平臺(tái)支持的實(shí)現(xiàn)不同,類庫(kù)不同,要編寫跨平臺(tái)的程序,需要選擇跨平臺(tái)的類庫(kù),如標(biāo)準(zhǔn)類庫(kù),如果標(biāo)準(zhǔn)類庫(kù)的支持不夠也只需要附加編寫一個(gè)跨平臺(tái)的支持類庫(kù)。 幾種語(yǔ)言內(nèi)容都很多,在這里就不詳細(xì)列舉了,要學(xué)好每一種都需要花費(fèi)相當(dāng)大的精力,祝你能有所成就! C#與JAVA的相同之處:由于C#與JAVA都是基于C++發(fā)展起來(lái)的,因此二者之間具有很多相似之處,具體如下:
1、C#和JAVA語(yǔ)言的編譯結(jié)果是獨(dú)立于計(jì)算機(jī)和編程語(yǔ)言的,可執(zhí)行文件可以在受管理的執(zhí)行 環(huán)境中執(zhí)行; 2、C#和JAVA語(yǔ)言都是采用了自動(dòng)的垃圾回收機(jī)制; 3、C#和JAVA語(yǔ)言都取消了指針操作; 4、C#和JAVA語(yǔ)言都沒(méi)有頭文件; 5、C#和JAVA語(yǔ)言都只支持單重繼承,要實(shí)現(xiàn)與多重繼承類似的功能,必須通過(guò)接口來(lái)實(shí)現(xiàn); 6、類都是從Object類派生而來(lái),類的對(duì)象通過(guò)關(guān)鍵字new生成; 7、C#和JAVA語(yǔ)言都支持線程; 8、C#和JAVA語(yǔ)言都沒(méi)有全局變量和全局函數(shù),所有的變量和函數(shù)都屬于某個(gè)類所有; 9、C#和JAVA語(yǔ)言都支持對(duì)數(shù)組和字符串邊界的嚴(yán)格檢查,不會(huì)出現(xiàn)邊界溢出的情況; 10、C#和JAVA語(yǔ)言都使用“.”操作符,不再使用“->”和“::”操作符; 11、C#和JAVA語(yǔ)言都將null和bool作為關(guān)鍵字; 12、C#和JAVA語(yǔ)言中所有的值都必須先初始化后才能使用; 13、C#和JAVA語(yǔ)言中的if語(yǔ)句都不允許采用整數(shù)作為判斷條件; 14、C#和JAVA語(yǔ)言中的try語(yǔ)句塊都可以后接finally語(yǔ)句塊。 C#與JAVA的不同之處: 盡管C#和JAVA有很多相同之處,但是由于二者是兩家不同公司開(kāi)發(fā)的高級(jí)程序設(shè)計(jì)語(yǔ)言,它們又相互獨(dú)立, 自成體系,各自具有一些自己特有的特點(diǎn),下面將C#與JAVA之間的不同之處如下: 1、屬性 對(duì)于那些經(jīng)常使用快速開(kāi)發(fā)工具,如Delphi或者Visual Basic的開(kāi)發(fā)人員來(lái)說(shuō),屬性是一個(gè)非常熟悉的概念。 一般來(lái)說(shuō),通過(guò)getXXX可以讀取屬性的值,而通過(guò)setXXX可以設(shè)置屬性的值。 JAVA中比較常見(jiàn)的屬性操作語(yǔ)句: foo.setSize(foo.getSize()+1); label.getFont().setBold(true); c#中比較常見(jiàn)的屬性操作語(yǔ)句: foo.size++; label.font.bold=true; 很明顯,上述的屬性設(shè)置方式較JAVA來(lái)說(shuō)更為簡(jiǎn)潔,可主讀性也更強(qiáng)。這充分體現(xiàn)了C#簡(jiǎn)單的特點(diǎn)。 JAVA對(duì)于屬性的定義:public int getSize(){ return size; } public void setSize(int value){ size=value; } c#對(duì)于屬性的定義進(jìn)行了簡(jiǎn)化:public int Size{ get{ return size; } set{size=value; }} 2、index C#提供index來(lái)給對(duì)象加上索引的功能,從而用與處理數(shù)組類似的方式來(lái)處理對(duì)象,JAVA語(yǔ)言則不支持index C#中定義index的典型方式如下: public Story this[int index] { get{return stories[index]; } set{ if(value!=null){ stories[index]=value } } 3、delegate :可以認(rèn)為是一種類型安全、面向?qū)ο蟮暮瘮?shù)指針。 C#使有delegate可以通過(guò)一個(gè)名字訪問(wèn)不同的函數(shù),它實(shí)現(xiàn)和JAVA中的interface類似的功能,但是它比interface更為好用。 4、event C#提供對(duì)event的直接支持,它通過(guò)delegate和event關(guān)鍵字實(shí)現(xiàn)對(duì)事件的處理。event關(guān)鍵字隱藏所有delegate方法,運(yùn)算符“+=”和“-+”允許程序員自由加入或者刪除時(shí)間處理程序。 5、enum:枚舉用于指定一系列的對(duì)象。 C#通過(guò)如下語(yǔ)句來(lái)定義和使用枚舉: 定義:public enum Direction{North,East,West,South}; 使用:Direction wall=Direction.North; JAVA不直接支持枚舉,如果要實(shí)現(xiàn)和C#相類似的功能,必須先定義一個(gè)類 public class Direction{ public final static int NORTH=1; public final static int EAST=2; public final static int WEST=3; public final static int SOUTH=4; } 在定義了Direction類后,JAVA可以通過(guò)引用類中的值來(lái)使用枚舉: int wall= Direction.NOTRH; 6、foreach語(yǔ)句 C#提供了標(biāo)準(zhǔn)的for循環(huán),同時(shí)還提供了foreach語(yǔ)句(從VB中引入)來(lái)循環(huán)處理集合中的元素。 JAVA遍歷集合中的所有元素的典型處理方式如下: while(!collection.isEmpty()) { Object o=collection.get(); connection.next(); … } C#遍歷集合中的所有元素:foreach(object o in collection){…} 7、統(tǒng)一數(shù)據(jù)類型: 大多數(shù)的高級(jí)程序設(shè)計(jì)語(yǔ)言都有基本數(shù)據(jù)類型,如整型、浮點(diǎn)類型等。同時(shí),為了更好地滿足實(shí)際的需要,對(duì)不同的數(shù)據(jù)類型有不同的處理方式,顯然,如果能夠?qū)?jiǎn)單數(shù)據(jù)類型的處理和對(duì)復(fù)雜數(shù)據(jù)類型的處理結(jié)合在一起,并用一致的方式加以處理的話,無(wú)疑會(huì)大大提升應(yīng)用程序設(shè)計(jì)的效率,增強(qiáng)程序設(shè)計(jì)的靈活性。 JAVA語(yǔ)言在處理基本數(shù)據(jù)類型的時(shí)候也采取分別處理的策略,但是在基本數(shù)據(jù)類型的基礎(chǔ)上提供了一系列封裝這些基本數(shù)據(jù)類型的類,例如:整型(int)被類Integer所封裝,雙精度浮點(diǎn)(double)被類Double封裝。 C#提供了一種和JAVA不同的方式來(lái)實(shí)現(xiàn)數(shù)據(jù)類型的統(tǒng)一。事實(shí)上,在c#中,即使是int這樣的簡(jiǎn)單數(shù)據(jù)類型在C#內(nèi)部也是通過(guò)一個(gè)結(jié)構(gòu)體Int32來(lái)實(shí)現(xiàn)的,在C#中,可以這樣認(rèn)為,int只是結(jié)構(gòu)體Int32的一個(gè)別名。由于C#中的結(jié)構(gòu)體也繼承自類Object,這樣,Object類中定義的方法,各個(gè)結(jié)構(gòu)體也擁有,于是,在C#中可以通過(guò)如下的方式來(lái)操作整數(shù):int I=5; System.Console.WriteLine(i.ToString()); 8、操作符重載 通過(guò)操作符重載可以用一種比較自然的方式來(lái)操縱各種數(shù)據(jù)類型,從而大大提升程序的可讀性和靈活性。C#中的“==”操作符在Object類中進(jìn)行了定義,在Object中定義的==操作符通過(guò)比較兩個(gè)值的引用來(lái)獲得最后的結(jié)果。如果使有和集合相關(guān)的類,則必須在這樣的類中實(shí)現(xiàn)ICompar接口,這個(gè)接口中定義了一個(gè)方法CompareTo,該方法返回兩個(gè)對(duì)象的比較結(jié)果,在此基礎(chǔ)上,可以進(jìn)一步定義各個(gè)實(shí)現(xiàn)比較的操作符,如 “>”、“<”、“>=”、“<=”等。事實(shí)上,數(shù)字類型(int、long等)可以直接使用這些比較操作符,它們的內(nèi)部都實(shí)現(xiàn)了ICompare接口。 9、多態(tài)性 虛似方法提供了多態(tài)性的技持。多態(tài)意味著派生類可以定義一個(gè)和基類中同名的方法。盡管JAVA和C#都支持多態(tài)性,但是它們的具體實(shí)現(xiàn)方式還是有一定的差別。 在JAVA語(yǔ)言中,默認(rèn)情況下,基類的對(duì)象可以直接調(diào)用派生類中的虛似方法,在C#語(yǔ)言中,基類要調(diào)用派生類中的虛似方法必須通過(guò)virtual關(guān)鍵字來(lái)實(shí)現(xiàn)。同時(shí),在C#語(yǔ)言中,一個(gè)方法要重載基類中的同名方法,還必須通過(guò)關(guān)鍵字override來(lái)實(shí)現(xiàn)。在C#中實(shí)現(xiàn)多態(tài)的典型程序如下: Class B{ public virtual void foo{}} Class D:B{ public overried void foo(){}} 以上只是簡(jiǎn)單地比較了C#和JAVA之間的異同,事實(shí)上,這二者之間的比較遠(yuǎn)不止上面所介紹的內(nèi)容,要學(xué)好這兩種語(yǔ)言,需要經(jīng)過(guò)大量的實(shí)踐工作,在實(shí)踐中區(qū)分開(kāi)兩種語(yǔ)言的共同點(diǎn)和不同點(diǎn)。 現(xiàn)在的面向?qū)ο蟮恼Z(yǔ)言大多數(shù)都源自C++,java去掉了C++中那些復(fù)雜,實(shí)用性低的語(yǔ)言特性,達(dá)到了一個(gè)不錯(cuò)的平衡。
C#是在java如日中天的時(shí)候產(chǎn)生了,因此它不可避免的引入了java中絕大多數(shù)優(yōu)秀的元素。 因此但從語(yǔ)言特性上,兩種語(yǔ)言不會(huì)出現(xiàn)一種能實(shí)現(xiàn),而一種無(wú)法實(shí)現(xiàn)的。 即便大型的應(yīng)用,也是都可以實(shí)現(xiàn),只不過(guò)可能在特定的方面,一種要比另一種做的好。 就算是所謂的跨平臺(tái)。假如微軟能推出linux版本的CLR和.net framework。c#一樣可以跨,因?yàn)樗蚸ava都是擁有底層托管機(jī)制的。 非要說(shuō)語(yǔ)言差別,下面基本應(yīng)該全了,不過(guò)這些在另一種中都有替代實(shí)現(xiàn)方法。 1.屬性: java中定義和訪問(wèn)均要用get和set方法,可以不成對(duì)出現(xiàn)。 c#中是真正的屬性,定義時(shí)get和set必須同時(shí)出現(xiàn),房問(wèn)時(shí)用.號(hào)即可。不用get,set 2.對(duì)象索引 就是對(duì)象數(shù)組 public Story this [int index] { 3.C#中,不用任何范圍修飾符時(shí),默認(rèn)的是protect,因而不能在類外被訪問(wèn). 4.因?yàn)镴AVA規(guī)定,在一個(gè)文件中只能有一個(gè)public類,而且這個(gè)類的名稱必須與文件名一模一樣,這是一個(gè)區(qū)別 5.在C#中,它是以Main方法來(lái)定位入口的.如果一個(gè)程序中沒(méi)有一個(gè)名為Main的方法,就會(huì)出"找不到入口的錯(cuò)誤".不要把Main寫成main喲 6.C#預(yù)定義的簡(jiǎn)單數(shù)據(jù)類型比Java多。例如,C#有unit,即無(wú)符號(hào)整數(shù) 7.忘掉Java中的static final修飾符。在C#中,常量可以用const關(guān)鍵詞聲明 C#的設(shè)計(jì)者還增加了readonly關(guān)鍵詞,readonly域只能通過(guò)初始化器或類的構(gòu)造函數(shù)設(shè)置 8.公用類的入口點(diǎn):c#是可以對(duì)Main進(jìn)行重載(java中是main),允許有int返回值和空參數(shù)的Main 9.在Java中,switch語(yǔ)句只能處理整數(shù)。但C#中的switch語(yǔ)句不同,它還能夠處理字符變量。請(qǐng)考慮下面用switch語(yǔ)句處理字符串變量的C#代碼 10.C#沒(méi)有>>>移位操作符 11.goto關(guān)鍵詞: Java不用goto關(guān)鍵詞。在C#中,goto允許你轉(zhuǎn)到指定的標(biāo)簽。不過(guò),C#以特別謹(jǐn)慎的態(tài)度對(duì)待goto,比如它不允許goto轉(zhuǎn)入到語(yǔ)句塊的內(nèi)部。在Java中,你可以用帶標(biāo)簽的語(yǔ)句加上break或continue取代C#中的goto。 12.int[] x = { 0, 1, 2, 3 }; int x[] = { 0, 1, 2, 3 }; 但在C#中,只有第一行代碼合法,[]不能放到變量名字之后。 13.與Java不同的是,C#允許為名稱空間或者名稱空間中的類指定別名: using TheConsole = System.Console; 14.在Java中,包的名字同時(shí)也是實(shí)際存在的實(shí)體,它決定了放置.java文件的目錄結(jié)構(gòu)。在C#中,物理的包和邏輯的名稱之間是完全分離的 .NET中包的實(shí)體稱為程序集(Assembly)。每一個(gè)程序集包含一個(gè)manifest結(jié)構(gòu)。manifest列舉程序集所包含的文件,控制哪些類型和資源被顯露到程序集之外,并把對(duì)這些類型和資源的引用映射到包含這些類型與資源的文件。程序集是自包含的,一個(gè)程序集可以放置到單一的文件之內(nèi),也可以分割成多個(gè)文件。.NET的這種封裝機(jī)制解決了DLL文件所面臨的問(wèn)題,即臭名昭著的DLL Hell問(wèn)題。 15.在Java中,java.lang包是默認(rèn)的包,C#中不存在默認(rèn)的包 16.C#中的訪問(wèn)修飾符與Java中的基本對(duì)應(yīng),但多出了一個(gè)internal。簡(jiǎn)而言之,C#有5種類型的可訪問(wèn)性,如下所示: public:成員可以從任何代碼訪問(wèn)。 protected:成員只能從派生類訪問(wèn)。 internal:成員只能從同一程序集的內(nèi)部訪問(wèn)。 protected internal:成員只能從同一程序集內(nèi)的派生類訪問(wèn)。 private:成員只能在當(dāng)前類的內(nèi)部訪問(wèn)。 17.由于C#中不存在final關(guān)鍵詞,如果想要某個(gè)類不再被派生,你可以使用sealed關(guān)鍵詞 18.與Java不同,C#中的接口不能包含域(Field)。 另外還要注意,在C#中,接口內(nèi)的所有方法默認(rèn)都是公用方法。在Java中,方法聲明可以帶有public修飾符(即使這并非必要),但在C#中,顯式為接口的方法指定public修飾符是非法的。例如,下面的C#接口將產(chǎn)生一個(gè)編譯錯(cuò)誤。 19.C#中的is操作符與Java中的instanceof操作符一樣,兩者都可以用來(lái)測(cè)試某個(gè)對(duì)象的實(shí)例是否屬于特定的類型。在Java中沒(méi)有與C#中的as操作符等價(jià)的操作符。as操作符與is操作符非常相似,但它更富有“進(jìn)取心”:如果類型正確的話,as操作符會(huì)嘗試把被測(cè)試的對(duì)象引用轉(zhuǎn)換成目標(biāo)類型;否則,它把變量引用設(shè)置成null。 20.C#仍舊保留了C++的內(nèi)存手工管理方法,它適合在速度極端重要的場(chǎng)合使用,而在Java中這是不允許的 21.在C#中,所有的異常都從一個(gè)名為Exception的類派生 22.枚舉器即enum類型(java無(wú)),把它作為一個(gè)變量值的類型使用,從而把變量可能的取值范圍限制為枚舉器中出現(xiàn)的值。 23.結(jié)構(gòu)(Struct)與類很相似,而結(jié)構(gòu)是一種值類型,它存儲(chǔ)在棧中或者是嵌入式的,結(jié)構(gòu)可以實(shí)現(xiàn)接口,可以象類一樣擁有成員,但結(jié)構(gòu)不支持繼承 24.屬性聲明語(yǔ)法的第一部分與域聲明很相似,第二部分包括一個(gè)set過(guò)程和/或一個(gè)get過(guò)程 25.傳值方式: 在java中簡(jiǎn)單數(shù)據(jù)類型的值傳參時(shí),都以傳值方式; 在c#中如果加ref則會(huì)以引用的方式傳值(方法內(nèi)部改變?cè)搮?shù),則外部變量一起跟著變); 加out與ref基本相同,但out不要求參數(shù)一定要初始化. 26.c#保留了指針。unsafe 27.代理:代理(delegate)可以看作C++或者其他語(yǔ)言中的函數(shù)指針 代理用來(lái)封裝可調(diào)用方法。你可以在類里面編寫方法并在該方法上創(chuàng)建代理,此后這個(gè)代理就可以被傳遞到第二個(gè)方法。這樣,第二個(gè)方法就可以調(diào)用第一個(gè)方法。 代理是從公共基類System.Delegate派生的引用類型。定義和使用代理包括三個(gè)步驟:聲明,創(chuàng)建實(shí)例,調(diào)用。代理用delegate聲明語(yǔ)法聲明。
C#、Java之比較 很多人說(shuō)C#是微軟用來(lái)和Java抗衡的武器,因?yàn)槎咴诤艽蟪潭壬嫌兄@人的相似 ,盡管如此,兩者不同的地方也很多,所謂“于細(xì)微處見(jiàn)差異”。那么兩者的相似和區(qū) 別都在什么地方呢?我們從今天開(kāi)始,會(huì)從各個(gè)角度來(lái)對(duì)比C#和Java的特點(diǎn),希望能對(duì) 1、C#和.NET平臺(tái)的概貌 2、C#和Java
下面簡(jiǎn)單地把C#和Java的相似處列出來(lái),雖然在這里我們重點(diǎn)討論的是C#和Java的 不同點(diǎn),但是了解一下二者的相同之處也是很有必要的。 二者都編譯成跨平臺(tái)的、跨語(yǔ)言的代碼,并且代碼只能在一個(gè)受控制的環(huán)境中運(yùn)行 自動(dòng)回收垃圾內(nèi)存,并且消除了指針(在C#中可以使用指針,不過(guò)必須注明unsafe 關(guān)鍵字)都不需要頭文件,所有的代碼都被“包(package)”限制在某個(gè)范圍內(nèi),并且因?yàn)闆](méi)有頭文件,所以消除了類定義的循環(huán)依賴所有的類都是從對(duì)象派生出來(lái),并且必須使用New關(guān)鍵字分配內(nèi)存用對(duì)象加鎖的方式來(lái)支持多線程都具有接口(interface)的概念內(nèi)部類繼承類的時(shí)候不會(huì)以某種特定的訪問(wèn)權(quán)限來(lái)繼承;沒(méi)有全局函數(shù)或者常量,一切必須屬于類;數(shù)組或者字符串都自帶長(zhǎng)度計(jì)算和邊界檢查;只使用“.”操作符,沒(méi)有“->”和“::”;"null”、“boolean”和“bool”成為了關(guān)鍵字;任何變量均在使用前進(jìn)行初始化; 不能使用整數(shù)來(lái)返回到if條件語(yǔ)句中,必須使用布爾值;“Try”模塊后可以有“finally” ;C#與JAVA之比較(圖表說(shuō)明)
自從互聯(lián)網(wǎng)出現(xiàn)以來(lái),Java就成了許多開(kāi)發(fā)者的首選.而許多C++開(kāi)發(fā)者在較短的時(shí)間內(nèi)轉(zhuǎn)移到了Java開(kāi)發(fā)者的隊(duì)伍中來(lái). Java成功的開(kāi)發(fā)和實(shí)現(xiàn)了許多高質(zhì)量的多線程動(dòng)畫, 游戲, 以及分布的應(yīng)用程序. 更重要的是,Java 語(yǔ)言是完全平臺(tái)無(wú)關(guān)的.
被稱作Apllets(小應(yīng)用程序)的Java程序在被下載到本地以前必須首先通過(guò)安全認(rèn)證,這樣就避免了任何病毒鉆入用戶的計(jì)算機(jī)的企圖. 許多新的改進(jìn),諸如旋擺軟件包(swing package), Java2D API, 連網(wǎng)軟件包(java .net)在最初的Java開(kāi)發(fā)包發(fā)布以后被加進(jìn)了這種語(yǔ)言里. 從Sun公司發(fā)布Java以來(lái),它的許多競(jìng)爭(zhēng)對(duì)手開(kāi)發(fā)了這種熱門語(yǔ)言的替代品,一些公司甚至在兩年以前就開(kāi)始了. 現(xiàn)在一家無(wú)需更多介紹的公司--微軟已經(jīng)發(fā)布了一種新的叫做微軟.NET的技術(shù). .NET家族的一種主要的語(yǔ)言是C#或者說(shuō)C-sharp. 這種語(yǔ)言是從Java/C++繼承而來(lái)的. 從我的對(duì)C#的六個(gè)月的技術(shù)上的經(jīng)驗(yàn)來(lái)說(shuō),我覺(jué)得C#或多或少與Java是相似的.但是C++的許多功能,比方說(shuō)操作符重載(它在Java中已經(jīng)被移去了)還存在于C#中. Java程序能夠在安裝了Java虛擬機(jī)或者JVM的任何平臺(tái)上運(yùn)行.但是.NET程序的平臺(tái)要求安裝了通用語(yǔ)言運(yùn)行庫(kù)或者稱做CLR. 它是所有.NET語(yǔ)言運(yùn)行所需的運(yùn)行庫(kù).所以一種.NET語(yǔ)言能夠調(diào)用另一種.NET語(yǔ)言寫成的模塊和函數(shù). 更進(jìn)一步的說(shuō),如果你學(xué)習(xí)了種像C#之類的語(yǔ)言,那么你就很容易學(xué)習(xí)另一種.NET語(yǔ)言因?yàn)樗械?NET語(yǔ)言遵循微軟所謂的.NET Framework(架構(gòu)). 這種架構(gòu)包括了編寫和安裝健壯的.NET應(yīng)用程序所必需的類庫(kù).使用.NET你可以通過(guò)ASP.NET進(jìn)行服務(wù)器端的編程,這點(diǎn)非常像JAVA中的servlets. 就象Java中的Applets, C#引入了WinForms 和WebForms的概念.使用WinForms你可以設(shè)計(jì)基于Windows的應(yīng)用程序而使用WebForms你能夠開(kāi)發(fā)Web應(yīng)用程序. 這點(diǎn)可以要么通過(guò)C#編程或者是使用Visual Studio.NET這樣的開(kāi)發(fā)環(huán)境工具來(lái)實(shí)現(xiàn). 它包含了Visual C#,使用Visual C#你可以非常容易的編寫C#應(yīng)用程序. 在我們使用Visual C++編程的時(shí)候,WinForms幾乎就是win32程序.用C++來(lái)開(kāi)發(fā)這些程序是可能的.但是VC++給我們提供向?qū)?lái)簡(jiǎn)化我們的開(kāi)發(fā)過(guò)程.現(xiàn)在Visual C#也在做同樣的工作.因此如果你已經(jīng)是一個(gè)VC++的程序員了,那么你最好試一試VC#. Java程序和C#程序的比較 我們應(yīng)該比較一下用Java寫成的程序和C#的有什么不同. 我們將討論兩個(gè)程序間主要的不同點(diǎn). Hello Java 程序 class Hello { // 類聲明 public static void main(String args[]) { // main 方法,入口點(diǎn) System.out.println("Hello Java"); // 向控制臺(tái)輸出Hello Java } } Hello C# 程序 using System; // 調(diào)用System命名空間 class Hello { // 類聲明 public static void Main () { // main 方法, 入口點(diǎn) console.writeLine("Hello C#"); // 向控制臺(tái)輸出 Hello C# } } 在Java中, lang軟件包是自動(dòng)引入的.在簡(jiǎn)單的程序里沒(méi)有必要引入這個(gè)包.但是在C#中,我們不得不在所有的程序里調(diào)用System命名空間. 請(qǐng)記住控制臺(tái)是System命名空間下的一個(gè)類. 試著運(yùn)行一下上面的程序并查看它們的輸出結(jié)果. Main方法 Java:你有可能編寫一個(gè)沒(méi)有main方法的Java程序,只要這個(gè)類是用來(lái)作為父類.但是只有類中包含有正確的Main方法的時(shí)候程序才能運(yùn)行. C#:沒(méi)有正確的Main方法就不可能編譯C#源程序.如果main方法缺失了,那么編譯器就會(huì)顯示一個(gè)錯(cuò)誤消息:程序'filename.exe'沒(méi)有定義入口點(diǎn). 繼承 Java 和C#都不支持多重繼承而且都提供接口的概念作為多重繼承的替代品.但是C#在接口中包括了更高級(jí)的內(nèi)容.請(qǐng)?jiān)诒疚哪┱页鲱}為新增加的特點(diǎn)的內(nèi)容. 操作符和控制流語(yǔ)句 Java中出現(xiàn)的所有諸如算術(shù),邏輯,自增和自減等操作符都可以在C#中找到. 而Java中的像if, else, if-else, for, do-while, while等控制流語(yǔ)句C#統(tǒng)統(tǒng)支持. 但是C# 增加了C++中流行的goto語(yǔ)句. 異常處理 在C#中你可以重用try, catch, finally, throws 語(yǔ)句處理運(yùn)行時(shí)錯(cuò)誤(通常也叫做異常).C# 中的異常處理過(guò)程除了一些小的不同以外幾乎與Java完全相同. C#中System.Exception命名空間是所有異常類的基類. 多線程 C#中多線程的應(yīng)用比起Java來(lái)要容易得多.我們可以使用Monitor 和 Mutex類同步線程. 新增特點(diǎn) 索引,屬性和代理是C#中的新概念.索引幾乎與Java中的向量相同. 對(duì)其新特點(diǎn)的完全的討論已經(jīng)超出了我們的范圍.但是我將盡量在這個(gè)網(wǎng)站的其它地方解釋它們. C#引入了Java所沒(méi)有的操作符重載的概念.但是Java和C#都支持方法重載. 讓我們回到對(duì)接口的討論,我們能夠驗(yàn)證包括在接口中的方法是否是使用is 和 as 操作符實(shí)現(xiàn)的.當(dāng)我們實(shí)現(xiàn)接口的時(shí)候能避免命名沖突.你甚至可以將兩個(gè)接口結(jié)合到一個(gè)中來(lái),并在類中實(shí)現(xiàn)這個(gè)復(fù)合的接口,如下面的代碼所示: using System; public interface First { void A(); void B(); } public interface Second { void C(); } public interface Combined: First, Second { } class Combineimple: Combined { // 這里是程序代碼 // main方法 } } 而且C#在顯示編譯錯(cuò)誤的時(shí)候還顯示它們的錯(cuò)誤代碼.你可以搜索與SDK有關(guān)的在線文檔尋找和這個(gè)錯(cuò)誤代碼有關(guān)的內(nèi)容并找出這個(gè)錯(cuò)誤發(fā)生的原因的細(xì)節(jié). |
|
來(lái)自: Frank_Chia > 《.NET》