最開始時微軟公司將Java當做一種能解決C和C++中存在的問題的語言,并不在意,并繼續維持和培訓著其C和C++技術和編程人員。接下來不幸的是,正當微軟盡力在Visual J++基礎上拓展Java功能,并使之與Windows操作系統緊密結合在一起的時候,Sun公司對微軟提出法律訴訟說其違反了許可證協議中的條款,最終的結果是微軟公司不得不停止其Visual J++產品的開發。(微軟公司仍然銷售Visual J++,但是從1998年10月以來就沒有新的版本發布,并且在.Net平臺上也沒有Visual J++的位置了)接下來的事情就很清楚了,微軟公司開發了C#語言。接下來的一部分將討論C#與Java的相似性。
C#與Java的區別
C#最引人的地方是它與Java的區別而不是其相似性。下面主要來介紹C#區別于Java的不同的運行特點及Java完全沒有的特點。
中間語言
當MSIL被編譯成最終的機器碼時,微軟公司在如何選擇上是非常靈活的。微軟公司很謹慎的對外宣稱說MSIL不是解釋型的,而是被編譯成機器碼。因為開發人員都有這樣一個觀念:Java程序天生就比C程序運行慢,所以這暗示著基于MSIL的程序優于解釋型的Java字節碼。當然,既然C#和其它MSIL產品編譯器還未發布,那么這一點就還未證明,但是Java無處不在的即時編譯器使得C#和Java在效能上是一樣的。象“C#是編譯型的,Java是解釋型的”這樣話只是銷售中的技巧。Java的字節碼和MSIL碼都是的類似匯編的中間語言,在運行時執行這些中間碼。
與COM的整合
對于基于Windows的C#開發人員來說,最大的收獲是對COM的無損整合,COM是微軟Win32的組件技術。實際上,任何一種.Net體系結構上的語言最終都可能去寫COM的客戶端和服務器端程序。用C#編寫的類也會作為COM組件的子類;結果類(resulting class)也能作為COM組件使用,并作為COM組件的子類。
微軟公司的目標是使越來越多的語言都能訪問組件,并使這些組件能整合到.Net體系結構中。已有幾個廠商開始著手開發支持.Net功能的編程語言,如COBOL和Haskell。開發人員能選擇不同的語言解決不同問題,更重要的是,開發人員不必為采用.Net體系結構而必須學習新語言,可以選擇一種他們熟悉的語言。
總結
本文的第一、二部分對C#做了一膚淺的總體介紹,主要是其產生動機及與Java的相似性。第三部分則涵概了C#的語言特點。用范例說明了C#與Java兩者在相似性外,它們又是非常不同的,有許多細微的語義和設計區別,適合不同的技術和市場環境,又談到了微軟公司對C#進行標準化方面的嘗試,及其對Java的影響。
c#與java的區別
1.屬性:
java中定義和訪問均要用get和set方法,可以不成對出現。
c#中是真正的屬性,定義時get和set必須同時出現,房問時用.號即可。不用get,set
2.對象索引
就是對象數組
public Story this [int index] {
3.C#中,不用任何范圍修飾符時,默認的是protect,因而不能在類外被訪問.
4.因為JAVA規定,在一個文件中只能有一個public類,而且這個類的名稱必須與文件名一模一樣,這是一個區別
5.在C#中,它是以Main方法來定位入口的.如果一個程序中沒有一個名為Main的方法,就會出"找不到入口的錯誤".不要把Main寫成main喲
6.C#預定義的簡單數據類型比Java多。例如,C#有unit,即無符號整數
7.忘掉Java中的static final修飾符。在C#中,常量可以用const關鍵詞聲明
C#的設計者還增加了readonly關鍵詞,readonly域只能通過初始化器或類的構造函數設置
8.公用類的入口點:c#是可以對Main進行重載(java中是main),允許有int返回值和空參數的Main
9.在Java中,switch語句只能處理整數。但C#中的switch語句不同,它還能夠處理字符變量。請考慮下面用switch語句處理字符串變量的C#代碼
10.C#沒有>>>移位操作符
11.goto關鍵詞:
Java不用goto關鍵詞。在C#中,goto允許你轉到指定的標簽。不過,C#以特別謹慎的態度對待goto,比如它不允許goto轉入到語句塊的內部。在Java中,你可以用帶標簽的語句加上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中,包的名字同時也是實際存在的實體,它決定了放置.java文件的目錄結構。在C#中,物理的包和邏輯的名稱之間是完全分離的
.NET中包的實體稱為程序集(Assembly)。每一個程序集包含一個manifest結構。manifest列舉程序集所包含的文件,控制哪些類型和資源被顯露到程序集之外,并把對這些類型和資源的引用映射到包含這些類型與資源的文件。程序集是自包含的,一個程序集可以放置到單一的文件之內,也可以分割成多個文件。.NET的這種封裝機制解決了DLL文件所面臨的問題,即臭名昭著的DLL Hell問題。
15.在Java中,java.lang包是默認的包,C#中不存在默認的包
16.C#中的訪問修飾符與Java中的基本對應,但多出了一個internal。簡而言之,C#有5種類型的可訪問性,如下所示:
public:成員可以從任何代碼訪問。
protected:成員只能從派生類訪問。
internal:成員只能從同一程序集的內部訪問。
protected internal:成員只能從同一程序集內的派生類訪問。
private:成員只能在當前類的內部訪問。
17.由于C#中不存在final關鍵詞,如果想要某個類不再被派生,你可以使用sealed關鍵詞
18.與Java不同,C#中的接口不能包含域(Field)。
另外還要注意,在C#中,接口內的所有方法默認都是公用方法。在Java中,方法聲明可以帶有public修飾符(即使這并非必要),但在C#中,顯式為接口的方法指定public修飾符是非法的。例如,下面的C#接口將產生一個編譯錯誤。
19.C#中的is操作符與Java中的instanceof操作符一樣,兩者都可以用來測試某個對象的實例是否屬于特定的類型。在Java中沒有與C#中的as操作符等價的操作符。as操作符與is操作符非常相似,但它更富有“進取心”:如果類型正確的話,as操作符會嘗試把被測試的對象引用轉換成目標類型;否則,它把變量引用設置成null。
20.C#仍舊保留了C++的內存手工管理方法,它適合在速度極端重要的場合使用,而在Java中這是不允許的
21.在C#中,所有的異常都從一個名為Exception的類派生
22.枚舉器即enum類型(java無),把它作為一個變量值的類型使用,從而把變量可能的取值范圍限制為枚舉器中出現的值。
23.結構(Struct)與類很相似,而結構是一種值類型,它存儲在棧中或者是嵌入式的,結構可以實現接口,可以象類一樣擁有成員,但結構不支持繼承
24.屬性聲明語法的第一部分與域聲明很相似,第二部分包括一個set過程和/或一個get過程
25.傳值方式:
在java中簡單數據類型的值傳參時,都以傳值方式;
在c#中如果加ref則會以引用的方式傳值(方法內部改變該參數,則外部變量一起跟著變);
加out與ref基本相同,但out不要求參數一定要初始化.
26.c#保留了指針。unsafe
27.代理:代理(delegate)可以看作C++或者其他語言中的函數指針
代理用來封裝可調用方法。你可以在類里面編寫方法并在該方法上創建代理,此后這個代理就可以被傳遞到第二個方法。這樣,第二個方法就可以調用第一個方法。
代理是從公共基類System.Delegate派生的引用類型。定義和使用代理包括三個步驟:聲明,創建實例,調用。代理用delegate聲明語法聲明。