C SHARP(C#)

 C sharp(又被簡稱爲“C#”)是微軟公司在去年六月發佈的一種新的編程語言,並定於在微軟職業開發者論壇(PDC)上登臺亮相.C#是微軟公司研究員Anders Hejlsberg的最新成果.C#看起來與Java有着驚人的相似;它包括了諸如單一繼承,界面,與Java幾乎同樣的語法,和編譯成中間代碼再運行的過程.但是C#與Java有着明顯的不同,它借鑑了Delphi的一個特點,與COM(組件對象模型)是直接集成的,而且它是微軟公司.NET windows網絡框架的主角.

在本文中,我將考察創建一種新計算機語言的一般動機,並將特別指明是什麼原因導致了C#的出現.然後我將介紹C#和它與Java,c,c++的相似之處.其次我將討論一些存在於Java和C#之間的高層次的,和基礎的差別.我將以衡量在用多種語言開發大型應用程序的時候所需的知識(或者對這種知識的缺乏程度)來結束本文,而這正是.NET和C#的一個主要戰略.目前,C#和.NET還只能以C#語言規則,以及Windows 2000的一個"d預覽版本",還有MSDN上迅速增多的文檔集子的形式獲得(還沒有最終定型).

微軟c#語言定義主要是從C和C++繼承而來的,而且語言中的許多元素也反映了這一點.C#在設計者從C++繼承的可選選項方面比Java要廣泛一些(比如說structs),它還增加了自己新的特點(比方說源代碼版本定義).但它還太不成熟,不可能擠垮Java.C#還需要進化成一種開發者能夠接受和採用的語言.而微軟當前爲它的這種新語言大造聲勢也是值得注意的.目前大家的反應是:"這是對Java的反擊."

C#更象Java一些,雖然微軟在這個問題上保持沉默.這也是意料中的事情,我覺得,因爲Java近來很成功而使用Java的公司都報告說它們在生產效率上比C++獲得了提高.

Java所帶來的巨大影響和大家對它的廣泛接受已經由工作於這種語言和平臺之上的程序員數量明顯的說明了(估計世界範圍內共有兩百五十萬程序員使用Java).由這種語言寫成的應用程序的數量是令人驚訝的並已經滲透了每一個級別的計算,包括無線計算和移動電話(比如日本發明的Java電話).C#能夠在用戶領域獲得這樣的禮遇嗎?我們必須等待並觀望,就象已經由SSI公司的CEO和主席Kalpathi S. Suresh指出來的那樣,"我發現所有這些都是漸進的.如果C#不存在,我們總能回到Java或C和C++.這些都不完全是新技術;它們在更大的意義上來說只是大公司製造的市場噱頭.我們必須給他們時間安頓下來看看這些是不是真的對IT工業有什麼影響."

C#從Java繼承而來的特點

類:在C#中類的申明與Java很相似.這是合理的因爲經驗告訴我們Java模型工作得很好.Java的關鍵字import已經被替換成using,它起到了同樣的作用.一個類開始執行的起點是靜態方法Main().下面的Hello World程序展示了基本的形式:

using System;

class Hello {

static void Main() {

Console.WriteLine("Hello, world");

}

}

在這個例子中,System這個名字指向一個包括了基本C#實用類集合的命名空間(namespace).這個命名空間包括了Console類,它在這個例子中被用來輸出一個字符串.類可以是抽象的和不可繼承的:一個被申明成abstract的類不能被實例化;它只能被用做一個基類.C#關鍵字lock就象Java關鍵字final,它申明一個類不是抽象的,但是它也不能被用做另一個類的基類.界面:就象在Java中一樣,一個界面是一組方法集合的抽象定義.當一個類或結構體實現一個界面的時候,它必須實現這個界面中定義的所有方法.一個單一的類可以實現幾個界面.也許以後會出現一些微妙的差別,但是這個特點看起來與Java相比沒有變化.布爾運算:條件表達式的結果是布爾數據類型,布爾數據類型是這種語言中獨立的一種數據類型.從布爾類型到其他類型沒有直接的轉換過程.布爾常量true和false是C#中的關鍵字.錯誤處理:如Java中那樣,通過拋出和捕捉異常對象來管理錯誤處理過程.內存管理:由底層.NET框架進行自動內存垃圾回收.

C#從C和C++繼承的特點

編譯:程序直接編譯成標準的二進制可執行形式.如果前面的Hello World程序被保存成一個文本文件並被命名爲Hello.cs,它將被編譯成命名Hello.exe的可執行程序.

結構體:一個C#的結構體與C++的結構體是相似的,因爲它能夠包含數據申明和方法.但是,不象C++,C#結構體與類是不同的而且不支持繼承.但是,與Java相同的是,一個結構體可以實現界面.

預編譯:C#中存在預編譯指令支持條件編譯,警告,錯誤報告和編譯行控制.可用的預編譯指令有:

#define

#undef

#if

#elif

#else

#endif

#warning

#error

#line []

沒有了#include 僞指令.你無法再用#define 語句對符號賦值,所以就不存在源代碼替換的概念--這些符號只能用在#if和#elif僞指令裏.在#line僞指令裏的數字(和可選的名字)能夠修改行號還有#warning和#error輸出結果的文件名.

操作符重載:一些操作符能夠被重載,而另一些則不能.特別的是,沒有一個賦值運算符能夠被重載.能夠被被重載的單目操作符是:

+ - ! ~ ++ -- true false

能夠被重載的二元運算符是:

+ - * / % & | ^ << >> == != > < >= <=

C#獨有的特點

C#最引人入勝的地方是它和Java的不同,而不是相似的地方.這一節(和這個系列第二部分的大部分地方)講述了C#實現的和Java不同的地方或者Java根本沒有的特點.

中間代碼:微軟在用戶選擇何時MSIL應該編譯成機器碼的時候是留了很大的餘地.微軟公司很小心的聲稱MSIL不是解釋性的,而是被編譯成了機器碼.它也明白許多--如果不是大多數的話--程序員認爲Java程序要不可避免的比C編寫的任何東西都要慢.而這種實現方式決定了基於MSIL的程序(指的是用C#,Visual Basic,"Managed C++"--C++的一個符合CLS的版本--等語言編寫的程序)將在性能上超過"解釋性的"Java代碼.當然,這一點還需要得到事實證明,因爲C#和其他生成MSIL的編譯器還沒有發佈.但是Java JIT編譯器的普遍存在使得Java和C#在性能上相對相同.象"C#是編譯語言而Java是解釋性的,"之類的聲明只是商業技巧.Java的中間代碼和MSIL都是中間的彙編形式的語言,它們在運行時或其它的時候被編譯成機器代碼.

命名空間中的申明:當你創建一個程序的時候,你在一個命名空間裏創建了一個或多個類.同在這個命名空間裏(在類的外面)你還有可能聲明界面,枚舉類型和結構體.必須使用using關鍵字來引用其他命名空間的內容.

基本的數據類型:C#擁有比C,C++或者Java更廣泛的數據類型.這些類型是bool, byte, ubyte, short, ushort, int, uint, long, ulong, float, double,和decimal.象Java一樣,所有這些類型都有一個固定的大小.又象C和C++一樣,每個數據類型都有有符號和無符號兩種類型.與Java相同的是,一個字符變量包含的是一個16位的Unicode字符.C#新的數據類型是decimal數據類型,對於貨幣數據,它能存放28位10進制數字.

兩個基本類:一個名叫object的類是所有其他類的基類.而一個名叫string的類也象object一樣是這個語言的一部分.作爲語言的一部分存在意味着編譯器有可能使用它--無論何時你在程序中寫入一句帶引號的字符串,編譯器會創建一個string對象來保存它.

參數傳遞:方法可以被聲明接受可變數目的參數.缺省的參數傳遞方法是對基本數據類型進行值傳遞.ref關鍵字可以用來強迫一個變量通過引用傳遞,這使得一個變量可以接受一個返回值.out關鍵字也能聲明引用傳遞過程,與ref不同的地方是,它指明這個參數並不需要初始值.

與COM的集成:C#對Windows程序最大的賣點可能就是它與COM的無縫集成了,COM就是微軟的Win32組件技術.實際上,最終有可能在任何.NET語言裏編寫COM客戶和服務器端.C#編寫的類可以子類化一個以存在的COM組件;生成的類也能被作爲一個COM組件使用,然後又能使用,比方說,JScript語言子類化它從而得到第三個COM組件.這種現象的結果是導致了一個運行環境的產生,在這個環境裏的組件是網絡服務,可用用任何.NET語言子類化.

索引下標:一個索引與屬性除了不使用屬性名來引用類成員而是用一個方括號中的數字來匿名引用(就象用數組下標一樣)以外是相似的.

public class ListBox: Control {

private string[] items;

public string this[int index] {

get {

return items[index];

}

set {

items[index] = value;

Repaint();

}

}

}

可以用一個循環器來匿名引用字符串內部數組成員,就象下面這樣:

ListBox listBox = ...;

listBox[0] = "hello";

Console.WriteLine(listBox[0]);

代理和反饋:一個代理對象包括了訪問一個特定對象的特定方法所需的信息.只要把它當成一個聰明的方法指針就行了.代理對象可以被移動到另一個地方,然後可以通過訪問它來對已存在的方法進行類型安全的調用.一個反饋方法是代理的特例.event關鍵字用在將在事件發生的時候被當成代理調用的方法聲明中.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章