C#, 是宣傳還是有用的技術? (轉)
C#, 是宣傳還是有用的技術? (轉)[@more@](讀做 "")是公司在去年六月釋出的一種新的語言,並定於在微軟職業開發者論壇(PDC)上登臺亮相.C#是微軟公司研究員Anders Hejlsberg的最新成果.C#看起來與有著驚人的相似;它包括了諸如單一繼承,介面,與Java幾乎同樣的語法,和編譯成中間程式碼再執行的過程.但是C#與Java有著明顯的不同,它借鑑了的一個特點,與COM(模型)是直接整合的,而且它是微軟公司 的主角.
在本文中,我將考察建立一種新語言的一般動機,並將特別指明是什麼原因導致了C#的出現.然後我將介紹C#和它與Java,c,c++的相似之處.其次我將討論一些存在於Java和C#之間的高層次的,和基礎的差別.我將以衡量在用多種語言開發大型應用的時候所需的知識(或者對這種知識的缺乏程度)來結束本文,而這正是.NET和C#的一個主要戰略.目前,C#和.NET還只能以C#語言規則,以及的一個"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#,,"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進位制數字.
兩個基本類:一個名叫的類是所有其他類的基類.而一個名叫string的類也象object一樣是這個語言的一部分.作為語言的一部分存在意味著編譯器有可能使用它--無論何時你在程式中寫入一句帶引號的字串,編譯器會建立一個string物件來儲存它.
引數傳遞:方法可以被宣告接受可變數目的引數.預設的引數傳遞方法是對基本資料型別進行值傳遞.ref關鍵字可以用來強迫一個變數透過引用傳遞,這使得一個變數可以接受一個返回值.out關鍵字也能宣告引用傳遞過程,與ref不同的地方是,它指明這個引數並不需要初始值.
與COM的整合:C#對Windows程式最大的賣點可能就是它與COM的無縫整合了,COM就是微軟的元件技術.實際上,最終有可能在任何.NET語言裡編寫COM客戶和端.C#編寫的類可以子類化一個以存在的COM元件;生成的類也能被作為一個COM元件使用,然後又能使用,比方說,語言子類化它從而得到第三個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關鍵字用在將在事件發生的時候被當成代理呼叫的方法宣告中.
結論
C#和C++之間的相似之處對任何已經對C和C++進行了培訓投資的公司來說是很大的好處.熟悉C++的程式設計師將很容易的學會C#.而且,花了時間學習Java的Windows程式設計師(通常以Visual J++的形式出現)將比C++程式設計師更快的學會C#.在程式設計界的普遍認為是"如果你學會了Java,而且懂得C++,那麼你已經懂得了C#的90%."
我希望本文給了你C#與Java和C++之間的聯絡的大概印象.總的說來,我相信C#提供了更大的程式表現力而且比Java更適合編寫效能關鍵的程式,而同時擁有Java的優美和簡潔,這都使得它比C++更誘人.
在本文中,我將考察建立一種新語言的一般動機,並將特別指明是什麼原因導致了C#的出現.然後我將介紹C#和它與Java,c,c++的相似之處.其次我將討論一些存在於Java和C#之間的高層次的,和基礎的差別.我將以衡量在用多種語言開發大型應用的時候所需的知識(或者對這種知識的缺乏程度)來結束本文,而這正是.NET和C#的一個主要戰略.目前,C#和.NET還只能以C#語言規則,以及的一個"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#,,"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進位制數字.
兩個基本類:一個名叫的類是所有其他類的基類.而一個名叫string的類也象object一樣是這個語言的一部分.作為語言的一部分存在意味著編譯器有可能使用它--無論何時你在程式中寫入一句帶引號的字串,編譯器會建立一個string物件來儲存它.
引數傳遞:方法可以被宣告接受可變數目的引數.預設的引數傳遞方法是對基本資料型別進行值傳遞.ref關鍵字可以用來強迫一個變數透過引用傳遞,這使得一個變數可以接受一個返回值.out關鍵字也能宣告引用傳遞過程,與ref不同的地方是,它指明這個引數並不需要初始值.
與COM的整合:C#對Windows程式最大的賣點可能就是它與COM的無縫整合了,COM就是微軟的元件技術.實際上,最終有可能在任何.NET語言裡編寫COM客戶和端.C#編寫的類可以子類化一個以存在的COM元件;生成的類也能被作為一個COM元件使用,然後又能使用,比方說,語言子類化它從而得到第三個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關鍵字用在將在事件發生的時候被當成代理呼叫的方法宣告中.
結論
C#和C++之間的相似之處對任何已經對C和C++進行了培訓投資的公司來說是很大的好處.熟悉C++的程式設計師將很容易的學會C#.而且,花了時間學習Java的Windows程式設計師(通常以Visual J++的形式出現)將比C++程式設計師更快的學會C#.在程式設計界的普遍認為是"如果你學會了Java,而且懂得C++,那麼你已經懂得了C#的90%."
我希望本文給了你C#與Java和C++之間的聯絡的大概印象.總的說來,我相信C#提供了更大的程式表現力而且比Java更適合編寫效能關鍵的程式,而同時擁有Java的優美和簡潔,這都使得它比C++更誘人.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-991841/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java 是傳值還是傳引用 (轉)Java
- 技術還是思想?
- 區塊鏈是真技術還是忽悠?區塊鏈
- 業務重要?還是技術重要?
- 工作筆記還是蠻有用筆記
- 是我們控制著技術,還是技術控制著我們?
- API還是微軟主推的技術嗎?API微軟
- 精益管理:是門技術,還是門社會科學?
- 怎麼讓老闆覺得你是個有用的技術人才?
- Java - 是值傳遞還是引用傳遞Java
- 轉賬問題是屬於業務問題還是屬於技術問題?
- 技術管理進階——管人還是管事?
- Java引數傳遞是傳值還是傳引用?Java
- 為什麼找不到工作的是你,技術差的還是你?
- java經典問題:傳值還是傳引用(轉)Java
- 什麼是技術債,為什麼要還技術債?
- 做FMEA,到底是方法論重要?還是技術重要?
- 人工智慧是攝影的未來還是攝影技術的末日?人工智慧
- 五年技術進化論(二):有用的創新是怎樣的
- NFT 專案是技術精英的傳銷? - NapkinAPK
- 解惑4:java是值傳遞還是引用傳遞Java
- JS是按值傳遞還是按引用傳遞?JS
- Go語言引數傳遞是傳值?還是傳引用 ?Go
- Go語言引數傳遞是傳值還是傳引用Go
- 學的是技術,用的是思想
- AI走向“戰爭技術”,是減少損傷還是推向災難AI
- Facebook加密貨幣廣告禁令大反轉:是擁抱新技術還是出於自私目的加密
- 努力一下,還是可以成為技術美術(TA)的
- IT行業更看重學歷還是更看重技術?行業
- 應該做技術還是應該做管理?
- 入侵檢測技術,雞肋還是機會?
- 工作五年後,做技術還是做管理?
- 宣佈開放API 是微軟的恩賜還是我們的權利API微軟
- 回答在職前端的疑問:平時工作是主抓業務還是主抓技術?前端
- Java是值傳遞還是引用傳遞,又是怎麼體現的Java
- Python 函式中,引數是傳值,還是傳引用?Python函式
- go語言引數傳遞到底是傳值還是傳引用Go
- “幽靈小分隊”反常理出牌背後,是安全防禦的缺失還是駭客技術的炫技?