一C#C++和Java C#的語言規范由Microsoft的Anders Hejlsberg與Scott Wiltamuth編寫
在當前Microsoft天花亂墜的宣傳中
對C#和C++
Java作一番比較總是很有趣的
考慮到當前IT媒體的輿論傾向
如果你早就知道C#更接近Java而不是C++
事情也不值得大驚小怪
對於剛剛加入這場討論的讀者
下面的表
讓你自己作出判斷
顯然
結論應該是
Java和C#雖然不是孿生子
但C#最主要的特色卻更接近Java而不是C++
了解表
總結的重要語言功能之後
請繼續往下閱讀
了解C#和Java的一些重要區別
二語言規范的比較 簡單數據類型
簡單數據類型(Primitive)在C#中稱為值類型
C#預定義的簡單數據類型比Java多
例如
C#有unit
即無符號整數
表
列出了所有C#的預定義數據類型
常量
忘掉Java中的static final修飾符
在C#中
常量可以用const關鍵詞聲明
public const int x =
;
此外
C#的設計者還增加了readonly關鍵詞
如果編譯器編譯時未能確定常量值
你可以使用readonly關鍵詞
readonly域只能通過初始化器或類的構造函數設置
公用類的入口點
在Java中
公用類的入口點是一個名為main的公用靜態方法
main方法的參數是String對象數組
它沒有返回值
在C#中
main方法變成了公用靜態方法Main(大寫的M)
Main方法的參數也是一個String對象數組
而且也沒有返回值
如下面的原型聲明所示
public static void Main(String[] args)
但是
C#的Main方法不局限於此
如果不向Main方法傳遞任何參數
你可以使用上述Main方法的一個重載版本
即不帶參數列表的版本
也就是說
下面的Main方法也是一個合法的入口點
public static void Main()
另外
如果你認為有必要的話
Main方法還可以返回一個int
例如
下面代碼中的Main方法返回
using System;
public class Hello {
public static int Main() {
Console
WriteLine(
Done
);
return
;
}
}
與此相對
在Java中重載main方法是不合法的
switch語句
在Java中
switch語句只能處理整數
但C#中的switch語句不同
它還能夠處理字符變量
請考慮下面用switch語句處理字符串變量的C#代碼
using System;
public class Hello {
public static void Main(String[] args) {
switch (args[
]) {
case
老板
:
Console
WriteLine(
早上好!我們隨時准備為您效勞!
);
break;
case
雇員
:
Console
WriteLine(
早上好!你可以開始工作了!
);
break;
default:
Console
WriteLine(
早上好!祝你好運!
);
break;
}
}
}
與Java中的switch不同
C#的switch語句要求每一個case塊或者在塊的末尾提供一個break語句
或者用goto轉到switch內的其他case標簽
foreach語句
foreach語句枚舉集合中的各個元素
為集合中的每一個元素執行一次代碼塊
請參見下面的例子
using System;
public class Hello {
public static void Main(String[] args) {
foreach (String arg in args)
Console
WriteLine(arg);
}
}
如果在運行這個執行文件的時候指定了參數
比如
Hello Peter Kevin Richard
則程序的輸出將是下面幾行文字
Peter
Kevin
Richard
C#沒有>>>移位操作符
C#支持uint和ulong之類的無符號變量類型
因此
在C#中
右移操作符(即
>>
)對於無符號變量類型和帶符號變量類型(比如int和long)的處理方式不同
右移uint和ulong丟棄低位並把空出的高位設置為零
但對於int和long類型的變量
>>
操作符丟棄低位
同時
只有當變量值是正數時
>>
才把空出的高位設置成零
如果
>>
操作的是一個負數
空出的高位被設置成為
Java中不存在無符號的變量類型
因此
我們用
>>>
操作符在右移時引入負號位
否則
使用
>>
操作符
goto關鍵詞
Java不用goto關鍵詞
在C#中
goto允許你轉到指定的標簽
不過
C#以特別謹慎的態度對待goto
比如它不允許goto轉入到語句塊的內部
在Java中
你可以用帶標簽的語句加上break或continue取代C#中的goto
聲明數組
在Java中
數組的聲明方法非常靈活
實際上有許多種聲明方法都屬於合法的方法
例如
下面的幾行代碼是等價的
int[] x = {
};
int x[] = {
};
但在C#中
只有第一行代碼合法
[]不能放到變量名字之後
包
在C#中
包(Package)被稱為名稱空間
把名稱空間引入C#程序的關鍵詞是
using
例如
using System;
這個語句引入了System名稱空間
然而
與Java不同的是
C#允許為名稱空間或者名稱空間中的類指定別名
using TheConsole = System
Console;
public class Hello {
public static void Main() {
TheConsole
WriteLine(
使用別名
);
}
}
雖然從概念上看
Java的包類似於
NET的名稱空間
然而
兩者的實現方式不同
在Java中
包的名字同時也是實際存在的實體
它決定了放置
java文件的目錄結構
在C#中
物理的包和邏輯的名稱之間是完全分離的
也就是說
名稱空間的名字不會對物理的打包方式產生任何影響
在C#中
每一個源代碼文件可以從屬於多個名稱空間
而且它可以容納多個公共類
NET中包的實體稱為程序集(Assembly)
每一個程序集包含一個manifest結構
manifest列舉程序集所包含的文件
控制哪些類型和資源被顯露到程序集之外
並把對這些類型和資源的引用映射到包含這些類型與資源的文件
程序集是自包含的
一個程序集可以放置到單一的文件之內
也可以分割成多個文件
NET的這種封裝機制解決了DLL文件所面臨的問題
即臭名昭著的DLL Hell問題
默認包
在Java中
java
lang包是默認的包
它無需顯式導入就已經自動包含
例如
要把一些文本輸出到控制台
你可以使用下面的代碼
System
out
println(
Hello world from Java
);
C#中不存在默認的包
如果要向控制台輸出文本
你使用System名稱空間Console對象的WriteLine方法
但是
你必須顯式導入所有的類
代碼如下
using System;
public class Hello {
public static void Main() {
Console
WriteLine(
Hello world from C#
);
}
}
面向對象
Java和C#都是完全面向對象的語言
在面向對象編程的三大原則方面
這兩種語言接近得不能再接近
繼承
這兩種語言都支持類的單一繼承
但類可以實現多個接口
所有類都從一個公共的基類繼承
封裝與可見性
無論是在Java還是C#中
你都可以決定類成員是否可見
除了C#的internal訪問修飾符之外
兩者的可見性機制非常相似
多態性
Java和C#都支持某些形式的多態性機制
且兩者實現方法非常類似
可訪問性
類的每個成員都有特定類型的可訪問性
C#中的訪問修飾符與Java中的基本對應
但多出了一個internal
簡而言之
C#有
種類型的可訪問性
如下所示
public
成員可以從任何代碼訪問
protected
成員只能從派生類訪問
internal
成員只能從同一程序集的內部訪問
protected internal
成員只能從同一程序集內的派生類訪問
private
成員只能在當前類的內部訪問
派生類
在Java中
我們用關鍵詞
extends
實現繼承
C#采用了C++的類派生語法
例如
下面的代碼顯示了如何派生父類Control從而創建出新類Button
public class Button: Control {
}
最終類
由於C#中不存在final關鍵詞
如果想要某個類不再被派生
你可以使用sealed關鍵詞
如下例所示
sealed class FinalClass {
}
接口
接口這個概念在C#和Java中非常相似
接口的關鍵詞是interface
一個接口可以擴展一個或者多個其他接口
按照慣例
接口的名字以大寫字母
I
開頭
下面的代碼是C#接口的一個例子
它與Java中的接口完全一樣
interface IShape { void Draw(); }
擴展接口的語法與擴展類的語法一樣
From:http://tw.wingwit.com/Article/program/Java/Javascript/201311/25420.html