首頁(yè) > 專(zhuān)家說(shuō)

C#和C shop是一回事嗎?C#的可視化能力跟Java比怎么樣?

來(lái)源:新能源網(wǎng)
時(shí)間:2024-08-17 12:06:50
熱度:

C#和C shop是一回事嗎?C#的可視化能力跟Java比怎么樣?【專(zhuān)家解說(shuō)】:C shop???c sharp C#(讀做 "C sharp",中文譯音“夏普”)是微軟公司發(fā)布的

【專(zhuān)家解說(shuō)】:C shop??? c sharp C#(讀做 "C sharp",中文譯音“夏普”)是微軟公司發(fā)布的一種面向?qū)ο蟮?、運(yùn)行于.NET framework之上的高級(jí)程序設(shè)計(jì)語(yǔ)言,并定于在微軟職業(yè)開(kāi)發(fā)者論壇(PDC)上登臺(tái)亮相.C#是微軟公司研究員Anders Hejlsberg的最新成果.C#看起來(lái)與Java有著驚人的相似;它包括了諸如單一繼承,界面,與Java幾乎同樣的語(yǔ)法,和編譯成中間代碼再運(yùn)行的過(guò)程.但是C#與Java有著明顯的不同,它借鑒了Delphi的一個(gè)特點(diǎn),與COM(組件對(duì)象模型)是直接集成的,而且它是微軟公司.NET windows網(wǎng)絡(luò)框架的主角. 在本文中,我將考察創(chuàng)建一種新計(jì)算機(jī)語(yǔ)言的一般動(dòng)機(jī),并將特別指明是什么原因?qū)е铝薈#的出現(xiàn).然后我將介紹C#和它與Java,c,c++的相似之處.其次我將討論一些存在于Java和C#之間的高層次的,和基礎(chǔ)的差別.我將以衡量在用多種語(yǔ)言開(kāi)發(fā)大型應(yīng)用程序的時(shí)候所需的知識(shí)(或者對(duì)這種知識(shí)的缺乏程度)來(lái)結(jié)束本文,而這正是.NET和C#的一個(gè)主要戰(zhàn)略.目前,C#和.NET還只能以C#語(yǔ)言規(guī)則,以及Windows 2000的一個(gè)"d預(yù)覽版本",還有MSDN上迅速增多的文檔集子的形式獲得(還沒(méi)有最終定型). 微軟c#語(yǔ)言定義主要是從C和C++繼承而來(lái)的,而且語(yǔ)言中的許多元素也反映了這一點(diǎn).C#在設(shè)計(jì)者從C++繼承的可選選項(xiàng)方面比Java要廣泛一些(比如說(shuō)structs),它還增加了自己新的特點(diǎn)(比方說(shuō)源代碼版本定義).但它還太不成熟,不可能擠垮Java.C#還需要進(jìn)化成一種開(kāi)發(fā)者能夠接受和采用的語(yǔ)言.而微軟當(dāng)前為它的這種新語(yǔ)言大造聲勢(shì)也是值得注意的.目前大家的反應(yīng)是:"這是對(duì)Java的反擊." C#更象Java一些,雖然微軟在這個(gè)問(wèn)題上保持沉默.這也是意料中的事情,我覺(jué)得,因?yàn)镴ava近來(lái)很成功而使用Java的公司都報(bào)告說(shuō)它們?cè)谏a(chǎn)效率上比C++獲得了提高. Java所帶來(lái)的巨大影響和大家對(duì)它的廣泛接受已經(jīng)由工作于這種語(yǔ)言和平臺(tái)之上的程序員數(shù)量明顯的說(shuō)明了(估計(jì)世界范圍內(nèi)共有兩百五十萬(wàn)程序員使用Java).由這種語(yǔ)言寫(xiě)成的應(yīng)用程序的數(shù)量是令人驚訝的并已經(jīng)滲透了每一個(gè)級(jí)別的計(jì)算,包括無(wú)線計(jì)算和移動(dòng)電話(比如日本發(fā)明的Java電話).C#能夠在用戶(hù)領(lǐng)域獲得這樣的禮遇嗎?我們必須等待并觀望,就象已經(jīng)由SSI公司的CEO和主席Kalpathi S. Suresh指出來(lái)的那樣,"我發(fā)現(xiàn)所有這些都是漸進(jìn)的.如果C#不存在,我們總能回到Java或C和C++.這些都不完全是新技術(shù);它們?cè)诟蟮囊饬x上來(lái)說(shuō)只是大公司制造的市場(chǎng)噱頭.我們必須給他們時(shí)間安頓下來(lái)看看這些是不是真的對(duì)IT工業(yè)有什么影響." C#從Java繼承而來(lái)的特點(diǎn) 類(lèi):在C#中類(lèi)的申明與Java很相似.這是合理的因?yàn)榻?jīng)驗(yàn)告訴我們Java模型工作得很好.Java的關(guān)鍵字import已經(jīng)被替換成using,它起到了同樣的作用.一個(gè)類(lèi)開(kāi)始執(zhí)行的起點(diǎn)是靜態(tài)方法Main().下面的Hello World程序展示了基本的形式: using System; class Hello { static void Main() { Console.WriteLine("Hello, world"); } } 在這個(gè)例子中,System這個(gè)名字指向一個(gè)包括了基本C#實(shí)用類(lèi)集合的命名空間(namespace).這個(gè)命名空間包括了Console類(lèi),它在這個(gè)例子中被用來(lái)輸出一個(gè)字符串.類(lèi)可以是抽象的和不可繼承的:一個(gè)被申明成abstract的類(lèi)不能被實(shí)例化;它只能被用做一個(gè)基類(lèi).C#關(guān)鍵字sealed就象Java關(guān)鍵字final,它申明一個(gè)類(lèi)不是抽象的,但是它也不能被用做另一個(gè)類(lèi)的基類(lèi).界面:就象在Java中一樣,一個(gè)界面是一組方法集合的抽象定義.當(dāng)一個(gè)類(lèi)或結(jié)構(gòu)體實(shí)現(xiàn)一個(gè)界面的時(shí)候,它必須實(shí)現(xiàn)這個(gè)界面中定義的所有方法.一個(gè)單一的類(lèi)可以實(shí)現(xiàn)幾個(gè)界面.也許以后會(huì)出現(xiàn)一些微妙的差別,但是這個(gè)特點(diǎn)看起來(lái)與Java相比沒(méi)有變化.布爾運(yùn)算:條件表達(dá)式的結(jié)果是布爾數(shù)據(jù)類(lèi)型,布爾數(shù)據(jù)類(lèi)型是這種語(yǔ)言中獨(dú)立的一種數(shù)據(jù)類(lèi)型.從布爾類(lèi)型到其他類(lèi)型沒(méi)有直接的轉(zhuǎn)換過(guò)程.布爾常量true和false是C#中的關(guān)鍵字.錯(cuò)誤處理:如Java中那樣,通過(guò)拋出和捕捉異常對(duì)象來(lái)管理錯(cuò)誤處理過(guò)程.內(nèi)存管理:由底層.NET框架進(jìn)行自動(dòng)內(nèi)存垃圾回收. C#從C和C++繼承的特點(diǎn) 編譯:程序直接編譯成標(biāo)準(zhǔn)的二進(jìn)制可執(zhí)行形式.但C#的源程序并不是被編譯成二進(jìn)制可執(zhí)行形式,而是一中中間語(yǔ)言,類(lèi)似于JAVA字節(jié)碼。如果前面的Hello World程序被保存成一個(gè)文本文件并被命名為Hello.cs,它將被編譯成命名Hello.exe的可執(zhí)行程序. 結(jié)構(gòu)體:一個(gè)C#的結(jié)構(gòu)體與C++的結(jié)構(gòu)體是相似的,因?yàn)樗軌虬瑪?shù)據(jù)申明和方法.但是,不象C++,C#結(jié)構(gòu)體與類(lèi)是不同的而且不支持繼承.但是,與Java相同的是,一個(gè)結(jié)構(gòu)體可以實(shí)現(xiàn)界面. 預(yù)編譯:C#中存在預(yù)編譯指令支持條件編譯,警告,錯(cuò)誤報(bào)告和編譯行控制.可用的預(yù)編譯指令有: #define #undef #if #elif #else #endif #warning #error #line [] 沒(méi)有了#include 偽指令.你無(wú)法再用#define 語(yǔ)句對(duì)符號(hào)賦值,所以就不存在源代碼替換的概念--這些符號(hào)只能用在#if和#elif偽指令里.在#line偽指令里的數(shù)字(和可選的名字)能夠修改行號(hào)還有#warning和#error輸出結(jié)果的文件名. 操作符重載:一些操作符能夠被重載,而另一些則不能.特別的是,沒(méi)有一個(gè)賦值運(yùn)算符能夠被重載.能夠被被重載的單目操作符是: + - ! ~ ++ -- true false 能夠被重載的二元運(yùn)算符是: + - * / % & | ^ << >> == != > < >= <= C#獨(dú)有的特點(diǎn) C#最引人入勝的地方是它和Java的不同,而不是相似的地方.這一節(jié)(和這個(gè)系列第二部分的大部分地方)講述了C#實(shí)現(xiàn)的和Java不同的地方或者Java根本沒(méi)有的特點(diǎn). 中間代碼:微軟在用戶(hù)選擇何時(shí)MSIL應(yīng)該編譯成機(jī)器碼的時(shí)候是留了很大的余地.微軟公司很小心的聲稱(chēng)MSIL不是解釋性的,而是被編譯成了機(jī)器碼.它也明白許多--如果不是大多數(shù)的話--程序員認(rèn)為Java程序要不可避免的比C編寫(xiě)的任何東西都要慢.而這種實(shí)現(xiàn)方式?jīng)Q定了基于MSIL的程序(指的是用C#,Visual Basic,"Managed C++"--C++的一個(gè)符合CLS的版本--等語(yǔ)言編寫(xiě)的程序)將在性能上超過(guò)"解釋性的"Java代碼.當(dāng)然,這一點(diǎn)還需要得到事實(shí)證明,因?yàn)镃#和其他生成MSIL的編譯器還沒(méi)有發(fā)布.但是Java JIT編譯器的普遍存在使得Java和C#在性能上相對(duì)相同.象"C#是編譯語(yǔ)言而Java是解釋性的,"之類(lèi)的聲明只是商業(yè)技巧.Java的中間代碼和MSIL都是中間的匯編形式的語(yǔ)言,它們?cè)谶\(yùn)行時(shí)或其它的時(shí)候被編譯成機(jī)器代碼. 命名空間中的申明:當(dāng)你創(chuàng)建一個(gè)程序的時(shí)候,你在一個(gè)命名空間里創(chuàng)建了一個(gè)或多個(gè)類(lèi).同在這個(gè)命名空間里(在類(lèi)的外面)你還有可能聲明界面,枚舉類(lèi)型和結(jié)構(gòu)體.必須使用using關(guān)鍵字來(lái)引用其他命名空間的內(nèi)容. 基本的數(shù)據(jù)類(lèi)型:C#擁有比C,C++或者Java更廣泛的數(shù)據(jù)類(lèi)型.這些類(lèi)型是bool, byte, ubyte, short, ushort, int, uint, long, ulong, float, double,和decimal.象Java一樣,所有這些類(lèi)型都有一個(gè)固定的大小.又象C和C++一樣,每個(gè)數(shù)據(jù)類(lèi)型都有有符號(hào)和無(wú)符號(hào)兩種類(lèi)型.與Java相同的是,一個(gè)字符變量包含的是一個(gè)16位的Unicode字符.C#新的數(shù)據(jù)類(lèi)型是decimal數(shù)據(jù)類(lèi)型,對(duì)于貨幣數(shù)據(jù),它能存放28位10進(jìn)制數(shù)字. 兩個(gè)基本類(lèi):一個(gè)名叫object的類(lèi)是所有其他類(lèi)的基類(lèi).而一個(gè)名叫string的類(lèi)也象object一樣是這個(gè)語(yǔ)言的一部分.作為語(yǔ)言的一部分存在意味著編譯器有可能使用它--無(wú)論何時(shí)你在程序中寫(xiě)入一句帶引號(hào)的字符串,編譯器會(huì)創(chuàng)建一個(gè)string對(duì)象來(lái)保存它. 參數(shù)傳遞:方法可以被聲明接受可變數(shù)目的參數(shù).缺省的參數(shù)傳遞方法是對(duì)基本數(shù)據(jù)類(lèi)型進(jìn)行值傳遞.ref關(guān)鍵字可以用來(lái)強(qiáng)迫一個(gè)變量通過(guò)引用傳遞,這使得一個(gè)變量可以接受一個(gè)返回值.out關(guān)鍵字也能聲明引用傳遞過(guò)程,與ref不同的地方是,它指明這個(gè)參數(shù)并不需要初始值. 與COM的集成:C#對(duì)Windows程序最大的賣(mài)點(diǎn)可能就是它與COM的無(wú)縫集成了,COM就是微軟的Win32組件技術(shù).實(shí)際上,最終有可能在任何.NET語(yǔ)言里編寫(xiě)COM客戶(hù)和服務(wù)器端.C#編寫(xiě)的類(lèi)可以子類(lèi)化一個(gè)以存在的COM組件;生成的類(lèi)也能被作為一個(gè)COM組件使用,然后又能使用,比方說(shuō),Jscript語(yǔ)言子類(lèi)化它從而得到第三個(gè)COM組件.這種現(xiàn)象的結(jié)果是導(dǎo)致了一個(gè)運(yùn)行環(huán)境的產(chǎn)生,在這個(gè)環(huán)境里的組件是網(wǎng)絡(luò)服務(wù),可用用任何.NET語(yǔ)言子類(lèi)化. 索引下標(biāo):一個(gè)索引與屬性除了不使用屬性名來(lái)引用類(lèi)成員而是用一個(gè)方括號(hào)中的數(shù)字來(lái)匿名引用(就象用數(shù)組下標(biāo)一樣)以外是相似的. public class ListBox: Control { private string[] items; public string this[int index] { get { return items[index]; } set { items[index] = value; Repaint(); } } } 可以用一個(gè)循環(huán)器來(lái)匿名引用字符串內(nèi)部數(shù)組成員,就象下面這樣: ListBox listBox = ...; listBox[0] = "hello"; Console.WriteLine(listBox[0]); 代理和反饋:一個(gè)代理對(duì)象包括了訪問(wèn)一個(gè)特定對(duì)象的特定方法所需的信息.只要把它當(dāng)成一個(gè)聰明的方法指針就行了.代理對(duì)象可以被移動(dòng)到另一個(gè)地方,然后可以通過(guò)訪問(wèn)它來(lái)對(duì)已存在的方法進(jìn)行類(lèi)型安全的調(diào)用.一個(gè)反饋方法是代理的特例.event關(guān)鍵字用在將在事件發(fā)生的時(shí)候被當(dāng)成代理調(diào)用的方法聲明.