Microsoft 新戰略的結果就是下一代的 Microsoft Visual Studio 將有重新設計的語言,尤其是能支援 .Net 平台。Java 將不再此程式包中,Visual J++ 也不會再有新的版本。不要擔心,Microsoft 將推出一個新的語言 C# 來填補這一空白。該公司動用了其最好的資源,包括星級語言專家 Anders Hejlsberg,來開發 C#。
非他莫屬:Anders Hejlsberg,語言體繫結構設計師
考慮一下 Hejlsberg 的經曆,就不會奇怪 Microsoft 將此重任交給他了。畢竟,C# 將不是他對軟體開發方式的首次大事改革。
Microsoft 用豐厚的薪水、股票認購權和巨額的加盟獎金雇請了 Hejlsberg 之後,Borland 曾提出通過不正當手段吸收新成員的控告。Borland 還曾聲稱 — 提供了很少的細節來支援指控 — Hejlsberg 正在開發“Delphi for Java”。這場訴訟最終以 Borland 的勝利而收場;但是從那時起,Microsoft 已在讓 Hejlsberg 工作了。
Hejlsberg 充實了 Microsoft 的 Java 產品;其中格外引人注意的是,為了跟上其他 Visual Studio 語言的現行版本號碼,他人為地在一個發行版中將其版本號碼從 1.1 提升到 6.0。實際上,這個版本號碼的跳躍並未誇大 6.0 與其前一版本之間的差別。Hejlsberg 添加的功能已使該語言變成一種強大的 Windows 應用程式開發平台。添加的功能包括對 Windows API 的訪問;因此,利用這些新功能的程式不再具有可移植性。
Hejlsberg 對 Microsoft 的 Java 產品的更改促使 Sun 控告 Microsoft 違反了 Java 許可協議。Sun 聲稱,Visual J++ 語言擴充沒有保持 Java 的平台中立性,而是將開發人員鎖定在 Microsoft 平台上。儘管 Microsoft 的 Visual J++ 事實上是最好的 Java 編譯器,並且該公司的虛擬器(執行 Java 位元組碼的運行期模組)是最快的一種虛擬機器,但 Sun 的訴訟已有效地阻止了 Microsoft 在 Java 舞台中的競爭。
快速應用程式開發:Microsoft 為 C# 制定的最重要的目標之一就是支援 RAD。網際網路應用程式必須以網際網路節奏開發;一種新語言必須易於學習和調試,而且必鬚生成易於更新的代碼。雖然 Delphi 和 VB 在這些方面很出色,但 C++ 卻沒有這麼成功。語言本身複雜而難以掌握,而且很少有有用的 C++ 庫提供簡單的介面。此外,C++ 的手動記憶體管理和複雜的類型轉換模型使它難以調試。
此外,正如我們將在下面看到的那樣,C++ 本質上不防止由於版本不相容而導致的潛在問題。儘管 Microsoft 和 Borland 對這種語言作了巨大的努力,但 C++ 仍然不適合快速應用程式開發。
跨平台部署:根據定義,網際網路語言應該支援跨平台的部署。因為網際網路是不同系統的一個網路,所以必須將服務部署到各式各樣的硬體和軟體上。 此外,用戶端軟體應該能夠運行在多種類型的裝置上,包括 PDA 和蜂窩式便攜無線電話。 這種靈活性事實上是對除 Java 之外的所有語言的一種挑戰。VB 尤其只能產生在基於 Intel 微處理器的機器上啟動並執行 Windows 應用程式。Delphi 也受到同樣的限制。Delphi for Linux 不久就會發布,但它也不支援網際網路裝置。VB 和 Delphi 都不符合跨平台部署的目標。
訪問平台固有的資源:據 Microsoft 稱,開發人員需要訪問平台固有的資源。對於編寫強大的目標應用程式而言,這種訪問有時是必不可少的。Visual J++ 6.0 允許開發人員訪問 Windows API,Java 通常不允許這種訪問。Java 通過定義每種虛擬機器實現的最小公分母標準來提供跨平台的部署。Java 開發人員依據這種削弱的標準編寫代碼,而不能利用只有某些平台才提供的更強大的服務。這樣,Java 無法滿足提供對平台固有資源的訪問這一目標。
支援 COM 和 .Net 平台:Microsoft 已將支援 COM 和 .Net 平台確定為 C# 的最重要的目標。當然,目前還沒有一種語言支援 .Net 平台,因為它仍在構建中。與 .Net 不同,COM 已出現相當一段時間了,但它仍然缺少強大的語言支援。大多數語言,包括 C++ 和 Delphi,都要求開發人員為他們所建立的每個 COM 物件建立一個額外的 IDL 聲明、一個類工廠和專用的修飾。
某些語言廠商已提供了一些嚮導來自動完成許多常見的 COM 和 OLE 任務,但這些工具沒有完全隱藏 COM 的複雜性。VB 確實成功隱藏了 COM 的複雜性,但這是以犧牲功能為代價換來的。VB 不僅缺乏物件導向語言的力量;它也無法支援 COM 的低級功能 — 例如,多個介面、聚集和自訂編排。簡而言之,沒有一種現有的語言像 C# 那樣全面支援 COM。
雖然這四個目標對於一種新語言是相當高的,但 Hejlsberg 在工作中已拿出自己最好的經驗來確保 C# 實現這些目標。結果是產生了一種語言,這種語言從 Java 和 Delphi 中借鑒東西與從 C 和 C++ 借鑒的東西一樣多(如果沒有超過的話)。請注意,下面的資訊基於 C# 操作規程,可能不準確代表最終的產品發行版。
C# 實現了 Java 和 Delphi 風格的值/參考型別系統:為了進一步支援 RAD,C# 始終以 Java 和 Delphi 風格的值/參考型別系統處理 C/C++ 指標模型。在這個系統中,內建類型(integer、real、string,等等)、枚舉 (enumeration) 和結構 (structure) 都是實值型別。賦值運算子和比較子複製並檢查這些類型的變數的值。介面、類和授權(將在後面說明)都是參考型別。賦值運算子和比較子複製並檢查這些類型的變數所引用的對象的同一性。
這種值/參考型別系統比 C++ 的指標模型要簡單得多。它使對象處理更加容易,並消除了困擾 C 和 C++ 程式的許多記憶體錯誤。
C# 介面是獨立於類來聲明的:C# 也支援類似 Java 和 Delphi 的介面模型,介面是獨立於類來聲明的。這與 C++ 模型是對立的,在 C++ 中介面實際上就是抽象基類。介面和類都可以繼承多個介面。而類可以繼承一個基類,介面根本不能繼承類。這種模型避免了 C++ 的多繼承問題,C++ 中不同基類中的實現可能出現衝突。因此也不再需要諸如虛擬繼承和顯式範圍這類複雜機制。C# 的簡化介面模型有助於加快應用程式的開發。
類方法的聲明和定義被組合在一起:C# 簡化開發的另一個方面是將類方法的聲明和定義組合在一起,與 Java 的做法十分類似。 C++ 開發人員必須為聲明(標頭檔)和定義(實現檔案)維護單獨的檔案,結果使得軟體開發過程變得複雜。C# 甚至能夠自動找出原始碼模組之間的關係,從而使開發人員從一項附加的雜務中解脫出來。儘管 C++ 需要使用 #include(Delphi 需要使用 uses)來定位相關的源檔案,但 C# 不需要任何額外的語句。
應用程式對平台固有資源的訪問:與 JAVA 虛擬機器不同,.Net 運行時允許程式訪問平台固有的資源。 例如,一個 C# 程式可以利用 Windows API 作為 Windows 2000 上全功能的應用程式運行。通過使用 Windows CE API 子集,同一個程式也可以在 PDA 上運行。 當然,並不是應用程式預期的所有服務都可在所有裝置上獲得。因此在所有目標平台上測試軟體是開發人員的責任,如有必要,開發人員還可以編寫特殊情況的代碼,那將使系統在缺少所需的服務時仍能夠工作。
支援 COM 和 .Net:為了支援 COM 和 .Net 平台,C# 包含一種稱為屬性的獨特語言特性。一個屬性實際上就是一個 C# 類,它通過修飾原始碼來提供元資訊。屬性使 C# 能夠支援特定的技術,如 COM 和 .Net,而不會干擾語言規範本身。
例如,C# 提供將 C# 介面轉換為 COM 介面的屬性類。另一些屬性類將 C# 類轉換為 COM 類別。執行這些轉換不需要任何 IDL 或類工廠。某些語言觀察家聲稱所有 C# 類都是 COM 物件。這不正確 — 但通過合適的屬性,任何 C# 類很容易轉換為一個 COM 物件。
隨編譯器提供的另一個屬性庫將 C# 類和函數封裝為 Web 服務。Web 服務是可在網際網路上通過互動協議(如 SOAP)調用的託管軟體模組。SOAP 將方法調用與它們的參數和傳回值一起封裝在 XML 資料包中。Web 服務可用許多語言編寫,並可部署到許多硬體和軟體平台上。而且,不同類型的 Web 服務可以協作組成整個 Web 應用程式。通過使用正確的屬性,程式員很容易將任何 C# 類或函數轉換為 Web 服務。
C# 不具備的特性
與 Anders Hejlsberg 的經曆一致,C# 用來支援網際網路應用程式的許多特性是從 Delphi 和 Java 挑選而來的。而 Microsoft 聲稱 C# 是從 C 和 C++ 轉變而來的。因此讓我們分析一下 C# 不具備的某些 C++ 特性。
範圍和非關聯化操作符:C# 不使用 C++ 範圍操作符 (::);而是依賴於 Delphi 和 Java 中類似的點操作符 (.)。此外,因為它基於前面說明的 Java 和 Delphi 風格的值/參考型別系統,在大多數情況下 C# 不使用 C++ 的非關聯化訪問符 (->),而是再次實現了點操作符。雖然重載的點操作符可能使剛開始學習 C# 的 C++ 程式員感到迷惑,但這對 Java 和 Delphi 開發人員來說是相當熟悉的。
作者簡介
Michael L. Perry 六年多來一直從事專業 Windows 開發,並擁有 COM+、Java、XML 等方面的專家經驗以及目前塑造編程前景的其他技術。他於 1998 年成立了 Mallard Software Designs 公司,在公司內他用數學嚴格證明軟體設計 — 在實現之前首先建立解決方案的正確性。