現(xiàn)在的面向?qū)ο蟮恼Z言大多數(shù)都源自C++,java去掉了C++中那些復(fù)雜,實(shí)用性低的語言特性,達(dá)到了一個(gè)不錯(cuò)的平衡。
C#是在
java如日中天的時(shí)候產(chǎn)生了,因此它不可避免的引入了java中絕大多數(shù)優(yōu)秀的元素。
因此但從語言特性上,兩種語言不會出現(xiàn)一種能實(shí)現(xiàn),而一種無法實(shí)現(xiàn)的。
即便大型的應(yīng)用,也是都可以實(shí)現(xiàn),只不過可能在特定的方面,一種要比另一種做的好。
就算是所謂的跨平臺。假如
微軟能推出linux版本的CLR和.net framework。c#一樣可以跨,因?yàn)樗蚸ava都是擁有底層托管機(jī)制的。
非要說語言差別,下面基本應(yīng)該全了,不過這些在另一種中都有替代實(shí)現(xiàn)方法。
1.屬性:
java中定義和訪問均要用get和set方法,可以不成對出現(xiàn)。
c#中是真正的屬性,定義時(shí)get和set必須同時(shí)出現(xiàn),房問時(shí)用.號即可。不用get,set
2.對象索引
就是對象數(shù)組
public Story this [int index] {
3.C#中,不用任何范圍修飾符時(shí),默認(rèn)的是protect,因而不能在類外被訪問.
4.因?yàn)镴AVA規(guī)定,在一個(gè)文件中只能有一個(gè)public類,而且這個(gè)類的名稱必須與文件名一模一樣,這是一個(gè)區(qū)別
5.在C#中,它是以Main方法來定位入口的.如果一個(gè)程序中沒有一個(gè)名為Main的方法,就會出"找不到入口的錯(cuò)誤".不要把Main寫成main喲
6.C#預(yù)定義的簡單數(shù)據(jù)類型比Java多。例如,C#有unit,即無符號整數(shù)
7.忘掉Java中的static final修飾符。在C#中,常量可以用const關(guān)鍵詞聲明
C#的設(shè)計(jì)者還增加了readonly關(guān)鍵詞,readonly域只能通過初始化器或類的構(gòu)造函數(shù)設(shè)置
8.公用類的入口點(diǎn):c#是可以對Main進(jìn)行重載(java中是main),允許有int返回值和空參數(shù)的Main
9.在Java中,switch語句只能處理整數(shù)。但C#中的switch語句不同,它還能夠處理字符變量。請考慮下面用switch語句處理字符串變量的C#代碼
10.C#沒有>>>移位操作符
11.goto關(guān)鍵詞:
Java不用goto關(guān)鍵詞。在C#中,goto允許你轉(zhuǎn)到指定的標(biāo)簽。不過,C#以特別謹(jǐn)慎的態(tài)度對待goto,比如它不允許goto轉(zhuǎn)入到語句塊的內(nèi)部。在Java中,你可以用帶標(biāo)簽的語句加上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列舉程序集所包含的文件,控制哪些類型和資源被顯露到程序集之外,并把對這些類型和資源的引用映射到包含這些類型與資源的文件。程序集是自包含的,一個(gè)程序集可以放置到單一的文件之內(nèi),也可以分割成多個(gè)文件。.NET的這種封裝機(jī)制解決了DLL文件所面臨的問題,即臭名昭著的DLL Hell問題。
15.在Java中,java.lang包是默認(rèn)的包,C#中不存在默認(rèn)的包
16.C#中的訪問修飾符與Java中的基本對應(yīng),但多出了一個(gè)internal。簡而言之,C#有5種類型的可訪問性,如下所示:
public:成員可以從任何代碼訪問。
protected:成員只能從派生類訪問。
internal:成員只能從同一程序集的內(nèi)部訪問。
protected internal:成員只能從同一程序集內(nèi)的派生類訪問。
private:成員只能在當(dāng)前類的內(nèi)部訪問。
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操作符一樣,兩者都可以用來
測試某個(gè)對象的實(shí)例是否屬于特定的類型。在Java中沒有與C#中的as操作符等價(jià)的操作符。as操作符與is操作符非常相似,但它更富有“進(jìn)取心”:如果類型正確的話,as操作符會嘗試把被測試的對象引用轉(zhuǎn)換成目標(biāo)類型;否則,它把變量引用設(shè)置成null。
20.C#仍舊保留了C++的內(nèi)存手工管理方法,它適合在速度極端重要的場合使用,而在Java中這是不允許的
21.在C#中,所有的異常都從一個(gè)名為Exception的類派生
22.枚舉器即enum類型(java無),把它作為一個(gè)變量值的類型使用,從而把變量可能的取值范圍限制為枚舉器中出現(xiàn)的值。
23.結(jié)構(gòu)(Struct)與類很相似,而結(jié)構(gòu)是一種值類型,它存儲在棧中或者是嵌入式的,結(jié)構(gòu)可以實(shí)現(xiàn)接口,可以象類一樣擁有成員,但結(jié)構(gòu)不支持繼承
24.屬性聲明語法的第一部分與域聲明很相似,第二部分包括一個(gè)set過程和/或一個(gè)get過程
25.傳值方式:
在java中簡單數(shù)據(jù)類型的值傳參時(shí),都以傳值方式;
在c#中如果加ref則會以引用的方式傳值(方法內(nèi)部改變該參數(shù),則外部變量一起跟著變);
加out與ref基本相同,但out不要求參數(shù)一定要初始化.
26.c#保留了指針。unsafe
27.代理:代理(delegate)可以看作C++或者
其他語言中的函數(shù)指針
代理用來封裝可調(diào)用方法。你可以在類里面編寫方法并在該方法上創(chuàng)建代理,此后這個(gè)代理就可以被傳遞到第二個(gè)方法。這樣,第二個(gè)方法就可以調(diào)用第一個(gè)方法。
代理是從公共基類System.Delegate派生的引用類型。定義和使用代理包括三個(gè)步驟:聲明,創(chuàng)建實(shí)例,調(diào)用。代理用delegate聲明語法聲明。