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