A Comparative Overview of C#中文版(一)

來源:互聯網
上載者:User
中文 A Comparative Overview of C#中文版(上篇)
作者:Ben Albahari
公司:Genamics
日期:2000年7月31日初版,2000年8月10日修訂。
感謝以下人士支援和反饋(按字母先後順序):Don Box、 C.R. Manning、 Joe Nalewabau、 John Osborn、 Thomas Rhode & Daryl Richter。
譯者:榮耀
【譯序:C#入門經典!希望文中針對新手的譯註不會影響閱讀的流暢性。限於譯者時間和能力,文中倘有訛誤,當以英文原版為準】

本文將以C#提供的新的編程方式以及它是如何改進兩個近鄰—Java和C++為中心。C#在很多方面和Java用了類似的方式改進C++。因此,我不打算重複諸如單根對象層次的優點之類的東西。本文將以C#和Java的相似之處概述開始,然後著重探究C#新特性。
背景
     2000年6月,微軟同時宣布了.NET平台和一個名為C#的新的程式設計語言。C#是一個很好地融合了簡單、表達力、效能的強型別的物件導向的語言。.NET平台以通用語言執行平台(類似於Java虛擬機器)和一個可被多種語言(它們可以通過編譯成中繼語言從而可以協同工作)共用的庫為中心。C#和.NET有那麼一點共生關係—C#的一些特性和.NET協作得很好,反之亦然(儘管.NET的目標是和多種語言很好地協作)。本文主要關注於C#,但視需要偶爾也會提及.NET。C#的設計借鑒了多種語言,但最主要的還是Java和C++。它是由Anders Hejlsberg(大名鼎鼎的Delphi【譯註:說成Object Pascal更合適些】語言設計師)和Scott Wiltamuth共同設計的。
目錄
1.   C#和Java
2.   屬性
3.   索引器
4.   委託
5.   事件
6.   枚舉
7.   集合和foreach語句
8.   結構
9.   類型一致
10.操作符重載
11.多態
12.介面
13.版本處理
14.參數修飾符
15.特性【譯註:即attribute,我在《C#首席設計師Anders Hejlsberg專訪》譯文中(參見CSDN的http://www.csdn.net/develop/article/11/11580.shtm)曾說過,到目前為止,該詞譯法仍較混亂,甚至和property不分,都被譯為“屬性”(Visual Studio.NET 7.0 Beta 2 的聯機文檔就是如此)。但本文中,仍將其譯為“特性”,以示區分】
16.選擇語句
17.預定義類型
18.欄位修飾符
19.跳躍陳述式
20.組合體、名字空間和存取層級【譯註:Assembly一詞譯法比較混亂,有的譯為“配件”,有的譯為“組件”,有的譯為“組合體”,而Visual Studio.NET 7.0 Beta2聯機文檔上則譯為“程式集”,從技術上講,這個譯法說的倒很事實,但總感覺和這個詞的外觀遠了點,在譯法尚未統一之前,本文暫譯為“組合體”】
21.指標運算
22.多維陣列【譯註:這一節裡還談到了交錯數組】
23.構造器和析構器
24.受控執行環境
25.庫
26.互用性
27.結論
1.C#和Java
下面是C#和Java共有的特性列表,目的都是為了改進C++。這些特性雖非本文重點,但瞭解它們之間的相似之處還是很重要的。
l          編譯為機器獨立、語言獨立的代碼,運行在受控執行環境裡;
l          採用垃圾收集機制,同時摒棄了指標(C#中,指標被限制在標為unsafe的代碼內使用);
l          強有力的反射能力;
l          沒有標頭檔,所有的代碼都在包或組合體裡,不存在類聲明的循環相依性問題;
l          所有的類都派生自object,且必須用new關鍵字分配在堆上;【譯註:Java中為Object;C#中為object,相當於.NET的System.Object】
l          當進入標為鎖定/同步代碼時,通過在對象上加鎖來支援多線程;【譯註:例如Java中可對方法施以synchronized關鍵字,在C#中可使用Monitor類、Mutex類、lock語句等等】
l          介面支援—多繼承介面,單繼承實現;
l          內部類;
l          類繼承時無需指定存取層級;【譯註:在C++中,你可以這麼做:class cls2: private cls1{};等等】
l          沒有全域函數或常量,一切都必須屬於類;
l          數組和字串都儲存長度記數並具邊界檢查能力;
l          永遠使用“.”操作符,不再有“->”、“::”操作符;
l          null和boolean/bool是關鍵字;【譯註:Java中為boolean、C#中為bool,相當於System.Boolean】
l          所有的值在使用前必須被初始化;
l          if語句不能使用整型數為判別條件;
l          try語句塊後可以跟finally從句。【譯註:標準C++不可以,但Visual C++對SEH做了擴充,可以用__try和__finally】
2.屬性
     對於Delphi和Visual Basic的使用者來說,屬性是個熟悉的概念。使用屬性的目的是將擷取器/設定器[譯註:原文為getter/setter]的概念正式化,這是一個被廣泛使用的模式,尤其是在RAD(快速應用開發)工具裡。
     以下是你可能在Java或C++裡寫的典型代碼:
foo.setSize (getSize () + 1);
label.getFont().setBold (true);
     同樣代碼在C#裡可能會變成:
foo.size++;
label.font.bold = true;
C#代碼對於使用foo和label的使用者來說更直觀、更可讀。在實現屬性方面,差不多同樣簡單:
Java/C++:
public int getSize()
{
    return size;
}
public void setSize (int value)
{
    size = value;
}
C#:
public int Size
{
    get {return size;}
    set {size = value;}
}
特別是對於可讀寫的屬性,C#提供了一個處理此概念的更清爽的方式。在C#中,get和set方法是內在的,而在Java和C++裡則需人為維護。C#的處理方式有諸多優點。它鼓勵程式員按照屬性的方式去思考—把這個屬性標為可讀寫的和唯讀哪個更自然?或者根本不應該為屬性?如果你想改變你的屬性的名稱,你只要檢查一處就可以了(我曾看到過中間隔了幾百行代碼的擷取器和設定器【譯註:此處是指C++(Java)裡對同一個資料成員/欄位(一般來說是)的擷取器和設定器】)。注釋也只要一處就可以了,這也避免了彼此同步的問題。IDE【譯註:整合式開發環境】是可以協助做這個事的(事實上,我建議他們這麼做【譯註:此處的“他們”應該是指微軟有關人員】),但應該牢記編程上的一個基本原理—儘力做好類比我們問題空間的抽象。一個支援屬性的語言將有助於獲得更好的抽象。
【作者註:關於屬性的這個優點的一個反對意見認為:當採用這種文法時,你搞不清是在操縱一個欄位還是屬性。然而,在Java(當然也包括C#)中,幾乎所有真正複雜一點的類都不會有public的欄位。欄位一般都只具有儘可能小的存取層級(private/protected,或語言所定義的預設的),並且只通過擷取器和設定器方法暴露,這也意味著你可以獲得優美的文法。讓IDE解析代碼也是完全可行的,可用不同的顏色高亮顯示內容,或提供程式碼完成資訊以表明它是否是一個屬性。我們還應該看到,如果一個類設計良好,這個類的使用者將只關心該類的介面(或規範)【譯註:此處是指該類向其客戶公開(不單單是public,對其衍生類別來說,也可能是protected)的方法、屬性(C++/Java無顯式屬性概念)等,這裡的客戶包括其衍生類別等等】,而不是其內部實現。另外一個可能的爭論是屬性不夠有效率。事實上,好的編譯器可以內聯僅返回某個欄位的擷取器,這和直接存取欄位一樣快。說到底,即使使用欄位要比擷取器/設定器來的有效,使用屬性還有如下好處—日後可以改變屬性的欄位【譯註:是指可以改變擷取器/設定器的實現代碼部分,比如改變擷取器/設定器裡所操作的欄位,也可以在擷取器/設定器裡做一些校正或修飾工作等】,而不會影響依賴於該屬性的代碼】
3.索引器
     C#通過提供索引器,可以象處理數組一樣處理對象。特別是屬性,每一個元素都以一個get或set方法暴露。
public class Skyscraper
{
    Story[] stories;
    public Story this [int index]
    {
        get
        {
            return stories [index];
        }
        set
        {
            if (value != null)
            {
                stories [index] = value;
            }
        }
    }
    //...
}
Skyscraper empireState = new Skyscraper (/*...*/);
empireState [102] = new Story ("The Top One", /*...*/);
【譯註:索引器最大的好處是使代碼看上去更自然,更符合實際的思考模式】
4.委託
     委託可以被認為是型別安全的、物件導向的函數指標,它可以擁有多個方法。委託處理的問題在C++中可以用函數指標處理,而在Java中則可以用介面處理。它通過提供型別安全和支援多方法改進了函數指標方式;它通過可以進行方法調用而不需要內部類適配器或額外的代碼去處理多方法調用問題而改進了介面方式。委託最重要用途是事件處理,下一節將通過一個例子加以介紹。
5.事件
     C#提供了對事件的直接支援。儘管事件處理一直是編程的基本部分,但令人驚訝的是,大多數語言在正式化這個概念上所做的努力都微乎其微。如果看看現今主流架構是如何處理事件的,我們可以舉出如下例子:Delphi的函數指標(稱為閉包)和Java的內部類適配器,當然還有Windows API訊息系統。C#使用delegate和event關鍵字提供了一個清爽的事件處理方案。我認為描述這個機制的最好的辦法是舉個例子來說明聲明、觸發和處理事件的過程:
// 委託聲明定義了可被調用的方法簽名【譯註:這裡的簽名可以理解為“原型”】
public delegate void ScoreChangeEventHandler (int newScore, ref bool cancel);
// 產生事件的類
public class Game
{
    //注意使用關鍵字
    public event ScoreChangeEventHandler ScoreChange;
    int score;
    // 屬性Score
    public int Score
    {
        get
        {
            return score;
     }
        set
        {
            if (score != value)
            {
                bool cancel = false;
                ScoreChange (value, ref cancel);
                if (! cancel)
                    score = value;
            }
        }
    }
}
// 處理事件的類
public class Referee
{
    public Referee (Game game)
    {
        // 監視game中的score的分數改變
        game.ScoreChange += new ScoreChangeEventHandler (game_ScoreChange);
    }
    // 注意這個方法簽名和ScoreChangeEventHandler的方法簽名要匹配
    private void game_ScoreChange (int newScore, ref bool cancel)
    {
        if (newScore < 100)
            System.Console.WriteLine ("Good Score");
        else
        {
            cancel = true;
            System.Console.WriteLine ("No Score can be that high!");
        }
    }
}
//測試類別
public class GameTest
{
    public static void Main ()
    {
        Game game = new Game ();
        Referee referee = new Referee (game);
        game.Score = 70;//【譯註:輸出 Good Score】
        game.Score = 110;// 【譯註:輸出 No Score can be that high!】
    }
}

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。