C# Java之比較 (轉)

worldblog發表於2007-12-07
C# Java之比較 (轉)[@more@]

很多人說是用來和抗衡的武器 因為二者在很大程度上有著驚人的相似 儘管如此 兩者不同的地方也很多 
所謂“於細微處見差異”。那麼兩者的相似和區別都在什麼地方呢 我們從今天開始 會從各個角度來對比C#和Java的特
點 希望能對正在學習 使用C#的朋友有所幫助。

1 C#和平臺的概貌

  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)的概念

內部類

  繼承類的時候不會以某種特定的訪問來繼承?

  沒有全域性函式或者常量 一切必須屬於類?

  陣列或者字串都自帶長度計算和邊界檢查?

  只使用“.”運算子 沒有“->”和“::”?

  “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和中是經常碰到的 在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", ...);

  呵呵 有了這種特性 我們就再不用怕課堂上老師叫我們寫物件陣列這種程式了。

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-989388/,如需轉載,請註明出處,否則將追究法律責任。

相關文章