關(guān)于c sharp的一系列文獻
2024-07-21 02:20:12
供稿:網(wǎng)友
注冊會員,創(chuàng)建你的web開發(fā)資料庫,microsoft正在緊鑼密鼓地計劃推出visual studio 6.0的下一代產(chǎn)品——visual studio.net。對于這個軟件包大家談?wù)撟疃嗟某?net外,要數(shù)它的另外一個利器c#。由于不準備在visual studio.net中包括visual j++,c#應該算是微軟針對java的相應產(chǎn)品。那么,什么是c#?它和c、c++究竟有什么不同?在此,我們歸納了一些關(guān)于c#常見的問題及解答,旨在幫助不了解它的讀者對它有個初步的認識。由于c#更多地類似c++,所以在此主要和c++做一對比。
概述
1. 什么是c#?
c#是microsoft公司設(shè)計的一種編程語言。它松散地基于c/c++,并且有很多方面和java類似。microsoft是這樣描述c#的:“c#是從c和c++派生來的一種簡單、現(xiàn)代、面向?qū)ο蠛皖愋桶踩木幊陶Z言。c#(讀做‘csharp’)主要是從c/c++編程語言家族移植過來的,c和c++的程序員會馬上熟悉它。c#試圖結(jié)合visual basic的快速開發(fā)能力和c++的強大靈活的能力。”
2. 什么時候c#發(fā)布?
沒有準確的時間,但是希望在2001年下半年。
3. 如何開發(fā)c#應用程序?
.net sdk包括了c#命令行編譯器(csc.exe),下一個版本的visual studio (visual studio 7 or visual studio.net)會包含對c#開發(fā)的完整支持。
4. 我從哪里可以下載.net sdk & visual studio 7?
你可以在http: //msdn.microsoft.com/net下載sdk的beta 2版本。如果你是一個msdn universal的定戶,你可以下載visual studio 7 beta 2。
5. c#可以取代java?
c#非常像java語言——這兩種語言的核心和c++相比都有相似的優(yōu)缺點。例如,兩個語言都有垃圾回收,但是兩個語言都沒有模板(template)。microsoft已經(jīng)中止了visual j++產(chǎn)品,因此很難不認為microsoft在使用c#來替代java。
6. c#可以取代 c++?
顯然是不,但是我們又很難說c++是新的.net平臺上編寫代碼的最佳選擇。為了使.net的運行層能完全發(fā)揮作用,它要求編程語言遵循某些特定的規(guī)則——其中之一就是所有的語言類型必須遵守通用類型系統(tǒng)(common type system,cts)。不幸的是,許多c++特性不能被cts支持。例如,模板和類的多重繼承。
microsoft對這個問題的答案是給c++提供可管理的擴展(managed extensions,me), 這可以使c++遵守cts。通過添加新的關(guān)鍵字來標記c++類有cts的屬性(例如.-gc表示垃圾回收)。但是在創(chuàng)建新的工程時很難講為什么me c++會比c#更合適。就特征(feature)而言它們很相似,但與c++不同的是c#從一開始就以.net為環(huán)境設(shè)計的。me c++存在的理由好像是將c++代碼移植(port)為.net環(huán)境下的代碼。
因此,這個問題的答案,很可能是c++作為一個.net環(huán)境之外的語言將依然保留它的重要性;而通過me將現(xiàn)存的c++代碼移植為適合.net環(huán)境;但是很可能c#將是c++開發(fā)者開發(fā)新的.net應用程序的最好選擇。
7. 一個簡單的c#程序是怎樣的?
可以是這樣:
class capplication {
public static void main() {
system.console.write( “hello, new .net world!” ); }}
(你不能將main()作為全局函數(shù)——c#沒有全局函數(shù))
8. c#是面向?qū)ο蟮膯?
是的,c#像java和c++一樣,是一個面向?qū)ο蟮恼Z言。
9. c#有自己的類庫嗎?
不,就像所有的.net語言(vb.net,jscript
.net...)一樣,c#訪問.net類庫,c#沒有自己的類庫。
基本類型
1. c#提供什么標準類型?
c# 支持的基本類型和c++很相似,包括int, long, float, double, char, string, arrays, structs 和 classes。然而,不要假設(shè)太多,名字可能很形似,但是一些細節(jié)不相同。例如c#中的long是64位的,而c++的long取決于平臺,32位的平臺上是32位的,64位的平臺上是64位的。class和struct在c++中幾乎完全一樣,但在c#中并不是這樣的。
2. 是否所有的c#類型都派生于一個公共的基類?
是,也不是,所有的對象都可以看作從object (system.object)派生而來。但是為了把像int,float這樣的值類型實例看作是從object對象派生的,這個實例必須通過一個裝箱的操作(boxing)轉(zhuǎn)化為引用類型。理論上,開發(fā)者可以忽略這些底層的轉(zhuǎn)化,但是認識到這點對于系統(tǒng)性能影響很重要。
3. 是否可以這樣認為,可以將一個值類型的實例作為參數(shù)傳給以對象為參數(shù)的方法?
是的,例如:
class capplication {
public static void main() {
int x = 25;
string s = “fred”;
displayme( x );
displayme( s ); }
static void displayme( object o ) {
system.console.writeline( “you are {0}”, o ); }}
將顯示:
you are 25
you are fred
4. 值類型和引用類型的最基本的區(qū)別是什么?
c#將類型分為兩類,一類是值類型,另一類是引用類型。大部分固有的基本類型(如int, char)是值類型,structs 也是值類型。引用類型包括類、接口、數(shù)組和字符串。基本的概念非常簡單,那就是一個值類型的實例代表了實際的數(shù)據(jù)(存在棧中),而一個引用類型的實例代表指向數(shù)據(jù)的指針或者引用(存在堆中)。
c++開發(fā)者最容易混淆的地方是:c#已經(jīng)自己預定義了一些類型作為值類型,一些作為引用類型,而一個c++的開發(fā)者希望能夠自己控制。
例如,在c++中,我們可以這樣做:
int x1 = 3; // x1 是堆棧上的值
int *x2 = new int(3) // x2 是堆的一個值的引用
但是在c#中沒有這樣的控制:
int x1 = 3; // x1是堆棧上的值
int x2 = new int();
x2 = 3; // x2還是堆棧上的值!
5. 好的,既然 int是值類型,而 class是引用類型,那么int是怎樣從object派生的呢?
不是這樣的,當int用作int時候,這是一個值類型(在棧上),然而,當它用作是object時,這是一個引用堆上的整數(shù)值的引用類型。換而言之,當你將int看作對象時,運行層將它自動轉(zhuǎn)化為對象引用,這個轉(zhuǎn)化過程稱作裝箱(boxing)。這個轉(zhuǎn)換包括將棧里的值拷貝到了堆里,并且新建了一個對象的實例來引用該值。拆箱操作(unboxing)是個反過程——將對象轉(zhuǎn)化為基于棧的值類型。
int x = 3;
// 堆棧上新的int類型,值為3
object objx = x;
// 堆上新的int, 設(shè)定值為3,x=3仍然在堆棧上
int y = (int)objx;
//新的int類型的值3在堆棧上,x=3在堆棧上,objx=3在堆上
6. c#使用引用替代指針,那么c#的引用和c++的引用一樣嗎?
不完全,基本的思想是一樣的,但是一個重要的區(qū)別是c#的引用可以是null。因此你不能確認c#的引用一定會是一個有效的對象。如果試圖使用一個值為null的引用,一個nullreferenceexception 異常將被拋出。
例如,看一看以下的方法:
void displaystringlength( string s ) {
console.writeline( “string is length {0}”, s.length ); }
如果這樣調(diào)用它,這種方法將產(chǎn)生一個nullreferenceexception 異常:
string s = null;
displaystringlength( s );
當然有些情況你認為產(chǎn)生這樣一個異常是完全可以接受的結(jié)果,但是在這個例子里最好按下面的代碼改寫一下:
void displaystringlength( string s ) {
if( s == null )
console.writeline(“string is null”);
else
console.writeline(“string is length {0}”, s.length );
}
class和struct
1. struct在c++中是多余的,為什么c#還要使用它們呢?
在c++中,一個結(jié)構(gòu)和一個類幾乎就是一個同樣的東西。唯一的區(qū)別是缺省的成員的訪問級別不一樣(struct的缺省級別是public,class的缺省級別是private)。然而,在c#中struct和class完全不一樣。在c#中,struct 是值類型,而class是引用類型。另外struct不能從其他struct或者class繼承,盡管struct可以實現(xiàn)接口。struct沒有析構(gòu)器。
2. c#支持多重繼承嗎?
c#支持接口的多重繼承,但是不支持類的多重繼承。
3. c#接口和c++抽象類一樣嗎?
不,不完全。c++的抽象類不能被實例化。但是它可以(而且經(jīng)常是)包含執(zhí)行代碼和數(shù)據(jù)成員。一個c#接口不能包含任何執(zhí)行代碼或數(shù)據(jù)成員,它只是一組方法名稱和簽名(signature)。一個c#的接口更像是一個com接口而不是抽象類。
另一個主要的不同點是:c#類只能從一個類(不管是否抽象)繼承,但可以實現(xiàn)多重接口。
4. c#構(gòu)造器和c++ 構(gòu)造器是否相同?
非常相似。
5. c#析構(gòu)器和c++ 析構(gòu)器是否相同?
不! 它們看起來相同,但是它們絕對不同。第一,c#析構(gòu)器不保證在某個特定的時間被調(diào)用。實際上它根本不保證被調(diào)用。真實的情況是,c#析構(gòu)器只是一個偽裝了的finalize方法。具體點講,它是一個插入調(diào)用基類finalize方法的finalize方法。因此,這段代碼:
class ctest {
~ctest() {
system.console.writeline(“bye bye” );
}
}
實際上就是:
class ctest {
protected override void finalize() {
system.console.writeline(“bye bye” );
base.finalize();
}
}
如果你不相信,可以將一個 finalize方法和一個析構(gòu)器加入c#類中,然后就可以知道是如何編譯的了。
6. 如果c#析構(gòu)器不同于c++析構(gòu)器,為什么使用相同的句法呢?
這確實使我們糊涂。
7. 什么是靜態(tài)構(gòu)造器?
它是整個類的一個構(gòu)造器,而不是類的一個實例的構(gòu)造器,它在類裝載的時候被調(diào)用。
8. c#中所有的方法都是虛方法嗎?
不,像c++一樣,缺省的時候,方法不是虛擬的,但都可以改為虛擬的。
9. 怎樣在c#中聲明一個純虛函數(shù)?
在方法前使用abstract修飾符,類也可以標記為abstract(這是自然的)。注意,abstract方法不能有執(zhí)行代碼(不同于c++中純虛方法)。
和c++處理的不同
1. 我“new”了一個對象,但是我怎樣刪除它?
你不能,不允許你顯式地調(diào)用析構(gòu)器,也沒有delete操作符。但是不必擔心,垃圾回收(garbage collection)會釋放你的對象,最終會的(也許會的)。
2. 我試圖在棧上建立一個對象,但是c#編譯器不通過,這是怎么回事?
和c++不同,你不能在棧上建立一個對象的實例。類的實例總是被建立在堆上并且接受垃圾回收器(garbage collection)的管理。
3. 我定義了一個析構(gòu)器,但是它從來不能被調(diào)用,為什么?
一個c#析構(gòu)器實際上是finalize方法的實現(xiàn),但是運行環(huán)境不保證調(diào)用finalize方法。你可以考慮通過調(diào)用gc.requestfinalizeonshutdown()方法試一下。
4. 大多數(shù)的c#基本類型和c++的基本類型有相同的名字,它們一樣嗎?
不,c#中char和c++中的wchar是相同的。c#中所有的字符包括字符串都是unicode的,c#中整型值是固定大小的,而在c++中其大小取決于處理器。例如,一個c#的int是32位的,而c++ 中int在32-bit處理器上是32位的,在64-bit處理器上是64位的,一個c#的long是64位的。