C#是微軟用來和Java抗衡的武器,因為二者在很大程度上有著驚人的相似,盡管如此,兩者不同的地方也很多,所謂“於細微處見差異”。那麼兩者的相似和區別都在什麼地方呢?我們從今天開始,會從各個角度來對比C#和Java的特點,希望能對正在學習、使用C#的朋友有所幫助。
1、C#和.Net平台的概貌
2000年6月,微軟發布C#語言和.NET平台。C#語言是一種強類型的,面向對象的語言,它具有語法簡單、表達力強的特點,而.NET平台則是構成微軟的“.Net計劃”的基石。
.Net平台的核心包括兩方面,一方面就是著名的通用語言運行機(Common Language Runtime),雖然這個名詞起得晦澀了點,不過大家可以拿它和Java的虛擬機來作比較,二者完成的任務大致相同;另一方面就是一大堆通用函數庫,這些庫函數可以被多種語言調用,並且通過編譯都產生一種共同的中間語言(Intermediate Language),這種語言也可以拿Java的字節碼來類比,雖然完成的方式有些不一樣。
2、C#和Java
下面簡單地把C#和Java的相似處列出來,雖然在這裡我們重點討論的是C#和Java的不同點,但是了解一下二者的相同之處也是很有必要的。
二者都編譯成跨平台的、跨語言的代碼,並且代碼只能在一個受控制的環境中運行
自動回收垃圾內存,並且消除了指針(在C#中可以使用指針,不過必須注明unsafe關鍵字)
都不需要頭文件,所有的代碼都被“包(package)”限制在某個范圍內,並且因為沒有頭文件,所以消除了類定義的循環依賴
所有的類都是從對象派生出來,並且必須使用New關鍵字分配內存
用對象加鎖的方式來支持多線程
都具有接口(interface)的概念
內部類
繼承類的時候不會以某種特定的訪問權限來繼承;
沒有全局函數或者常量,一切必須屬於類;
數組或者字符串都自帶長度計算和邊界檢查;
只使用“.”操作符,沒有“-$#@62;”和“::”;
“null”、“boolean”和“bool”成為了關鍵字;
任何變量均在使用前進行初始化;
不能使用整數來返回到if條件語句中,必須使用布爾值;
“Try”模塊後可以有“finally” ;
3. 屬性(Property)
屬性的概念對大家來說應該是很熟悉的,類成員函數可以自由地訪問本類? 任何屬性成員。不過若要從一個類中去訪問另一個類中的屬性,那就比較麻煩了,所以很多時候我們使用Getxxx和Setxxx方法,這樣看起來顯得極不自然,比如用Java或者C++,代碼是這樣的:
foo.setSize (getSize () + 1);
label.getFont().setBold (true);
但是,在C#中,這樣的方法被“屬性化”了。同樣的代碼,在C#就變成了:
foo.size++;
label.font.bold = true;
可以看出來,C#顯然更容易閱讀和理解。我們從這個“屬性方法”的子程序代碼中,也可以看到類似情況:
Java/C++:
public int getSize()
{
return size;
}
public void setSize (int value)
{
size = value;
}
C#:
public int Size
{
get{return size;}
set{size = value;}
}
為了區分這種屬性化的方法和類的屬性成員,在C#中把屬性成員稱作“域(fIEld)”,而“屬性”則成為這種“屬性化的方法”專用的名詞。順便說一句,其實這樣的屬性化方法在VB和Delphi中是經常碰到的,在VB中它也就叫屬性。
另外,在C#中Get和Set必須成對出現,一種屬性不能只有Get而沒有Set(在Java和C++中就可以只有Get或者只有Set),C#中這樣做的好處在於便於維護,假如要對某種屬性進行修改,就會同時注意Get和Set方法,同時修改,不會改了這個忘了那個。
4、對象索引機制(Indexer)
C#中引入了對象索引機制。說得明白點,對象索引其實就是對象數組。這裡和上一節中的屬性聯系起來講一下,屬性需要隱藏Get和Set方法,而在索引機制中,各個對象的Get或者Set方法是暴露出來的。比如下面的例子就比較清楚地說明了這一點。
public class Skyscraper
{
Story[] storIEs;
public Story this [int index] {
get {
return storIEs [index];
}
set {
if (value != null) {
storIEs [index] = value;
}
}
}
...
}
Skyscraper empireState = new Skyscraper (...);
empireState [102] = new Story ("The Top One", ...);
呵呵,有了這種特性,我們就再不用怕課堂上老師叫我們寫對象數組這種