• <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        當(dāng)前位置:雨林木風(fēng)下載站 > 技術(shù)開發(fā)教程 > 詳細(xì)頁面

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

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

        更新時間:2022-05-01 文章作者:未知 信息來源:網(wǎng)絡(luò) 閱讀次數(shù):

        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#入門經(jīng)典!希望文中針對新手的譯注不會影響閱讀的流暢性。限于譯者時間和能力,文中倘有訛誤,當(dāng)以英文原版為準(zhǔn)】

        本文將以C#提供的新的編程方式以及它是如何改進兩個近鄰—Java和C++為中心。C#在很多方面和Java用了類似的方式改進C++。因此,我不打算重復(fù)諸如單根對象層次的優(yōu)點之類的東西。正文將以C#和Java的相似之處概述開始,然后著重探究C#新特性。
        背景
         2000年6月,微軟同時宣布了.NET平臺和一個名為C#的新的編程語言。C#是一個很好地融合了簡單、表達力、性能的強類型的面向?qū)ο蟮恼Z言。.NET平臺以公共語言運行時(類似于Java虛擬機)和一個可被多種語言(它們可以通過編譯成中間語言從而可以協(xié)同工作)共用的庫為中心。C#和.NET有那么一點共生關(guān)系—C#的一些特性和.NET協(xié)作得很好,反之亦然(盡管.NET的目標(biāo)是和多種語言很好地協(xié)作)。本文主要關(guān)注于C#,但視需要偶爾也會提及.NET。C#的設(shè)計借鑒了多種語言,但最主要的還是Java和C++。它是由Anders Hejlsberg(大名鼎鼎的Delphi【譯注:說成Object Pascal更合適些】語言設(shè)計師)和Scott Wiltamuth共同設(shè)計的。
        目錄
        1. C#和Java
        2. 屬性
        3. 索引器
        4. 委托
        5. 事件
        6. 枚舉
        7. 集合和foreach語句
        8. 結(jié)構(gòu)
        9. 類型一致
        10.操作符重載
        11.多態(tài)
        12.接口
        13.版本處理
        14.參數(shù)修飾符
        15.特性【譯注:即attribute,我在《C#首席設(shè)計師Anders Hejlsberg專訪》譯文中(參見CSDN的http://www.csdn.net/develop/article/11/11580.shtm)曾說過,到目前為止,該詞譯法仍較混亂,甚至和property不分,都被譯為“屬性”(Visual Studio.NET 7.0 Beta 2 的聯(lián)機文檔就是如此)。但本文中,仍將其譯為“特性”,以示區(qū)分】
        16.選擇語句
        17.預(yù)定義類型
        18.字段修飾符
        19.跳轉(zhuǎn)語句
        20.組合體、名字空間和訪問級別【譯注:Assembly一詞譯法比較混亂,有的譯為“配件”,有的譯為“組件”,有的譯為“組合體”,而Visual Studio.NET 7.0 Beta2聯(lián)機文檔上則譯為“程序集”,從技術(shù)上講,這個譯法說的倒很事實,但總感覺和這個詞的外觀遠(yuǎn)了點,在譯法尚未統(tǒng)一之前,本文暫譯為“組合體”】
        21.指針運算
        22.多維數(shù)組【譯注:這一節(jié)里還談到了交錯數(shù)組】
        23.構(gòu)造器和析構(gòu)器
        24.受控執(zhí)行環(huán)境
        25.庫
        26.互用性
        27.結(jié)論
        1.C#和Java
        下面是C#和Java共有的特性列表,目的都是為了改進C++。這些特性雖非本文重點,但了解它們之間的相似之處還是很重要的。
        l編譯為機器獨立、語言獨立的代碼,運行在受控執(zhí)行環(huán)境里;
        l采用垃圾收集機制,同時摒棄了指針(C#中,指針被限制在標(biāo)為unsafe的代碼內(nèi)使用);
        l強有力的反射能力;
        l沒有頭文件,所有的代碼都在包或組合體里,不存在類聲明的循環(huán)依賴問題;
        l所有的類都派生自object,且必須用new關(guān)鍵字分配在堆上;【譯注:Java中為Object;C#中為object,相當(dāng)于.NET的System.Object】
        l當(dāng)進入標(biāo)為鎖定/同步代碼時,通過在對象上加鎖來支持多線程;【譯注:例如Java中可對方法施以synchronized關(guān)鍵字,在C#中可使用Monitor類、Mutex類、lock語句等等】
        l接口支持—多繼承接口,單繼承實現(xiàn);
        l內(nèi)部類;
        l類繼承時無需指定訪問級別;【譯注:在C++中,你可以這么做:class cls2: private cls1{};等等】
        l沒有全局函數(shù)或常量,一切都必須屬于類;
        l數(shù)組和字符串都保存長度記數(shù)并具邊界檢查能力;
        l永遠(yuǎn)使用“.”操作符,不再有“->”、“::”操作符;
        lnull和boolean/bool是關(guān)鍵字;【譯注:Java中為boolean、C#中為bool,相當(dāng)于System.Boolean】
        l所有的值在使用前必須被初始化;
        lif語句不能使用整型數(shù)為判別條件;
        ltry語句塊后可以跟finally從句。【譯注:標(biāo)準(zhǔn)C++不可以,但Visual C++對SEH做了擴展,可以用__try和__finally】
        2.屬性
         對于Delphi和Visual Basic的用戶來說,屬性是個熟悉的概念。使用屬性的目的是將獲取器/設(shè)置器[譯注:原文為getter/setter]的概念正式化,這是一個被廣泛使用的模式,尤其是在RAD(快速應(yīng)用開發(fā))工具里。
         以下是你可能在Java或C++里寫的典型代碼:
        foo.setSize (getSize () + 1);
        label.getFont().setBold (true);
         同樣代碼在C#里可能會變成:
        foo.size++;
        label.font.bold = true;
        C#代碼對于使用foo和label的用戶來說更直觀、更可讀。在實現(xiàn)屬性方面,差不多同樣簡單:
        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方法是內(nèi)在的,而在Java和C++里則需人為維護。C#的處理方式有諸多優(yōu)點。它鼓勵程序員按照屬性的方式去思考—把這個屬性標(biāo)為可讀寫的和只讀的哪個更自然?或者根本不應(yīng)該為屬性?如果你想改變你的屬性的名稱,你只要檢查一處就可以了(我曾看到過中間隔了幾百行代碼的獲取器和設(shè)置器【譯注:此處是指C++(Java)里對同一個數(shù)據(jù)成員/字段(一般來說是)的獲取器和設(shè)置器】)。注釋也只要一處就可以了,這也避免了彼此同步的問題。IDE【譯注:集成開發(fā)環(huán)境】是可以幫助做這個事的(事實上,我建議他們這么做【譯注:此處的“他們”應(yīng)該是指微軟有關(guān)人員】),但應(yīng)該牢記編程上的一個基本原理—盡力做好模擬我們問題空間的抽象。一個支持屬性的語言將有助于獲得更好的抽象。
        【作者注:關(guān)于屬性的這個優(yōu)點的一個反對意見認(rèn)為:當(dāng)采用這種語法時,你搞不清是在操縱一個字段還是屬性。然而,在Java(當(dāng)然也包括C#)中,幾乎所有真正復(fù)雜一點的類都不會有public的字段。字段一般都只具有盡可能小的訪問級別(private/protected,或語言所定義的缺省的),并且只通過獲取器和設(shè)置器方法暴露,這也意味著你可以獲得優(yōu)美的語法。讓IDE解析代碼也是完全可行的,可用不同的顏色高亮顯示屬性,或提供代碼完成信息以表明它是否是一個屬性。我們還應(yīng)該看到,如果一個類設(shè)計良好,這個類的用戶將只關(guān)心該類的接口(或規(guī)范)【譯注:此處是指該類向其客戶公開(不單單是public,對其派生類來說,也可能是protected)的方法、屬性(C++/Java無顯式屬性概念)等,這里的客戶包括其派生類等等】,而不是其內(nèi)部實現(xiàn)。另外一個可能的爭論是屬性不夠有效率。事實上,好的編譯器可以內(nèi)聯(lián)僅返回某個字段的獲取器,這和直接訪問字段一樣快。說到底,即使使用字段要比獲取器/設(shè)置器來的有效,使用屬性還有如下好處—日后可以改變屬性的字段【譯注:是指可以改變獲取器/設(shè)置器的實現(xiàn)代碼部分,比如改變獲取器/設(shè)置器里所操作的字段,也可以在獲取器/設(shè)置器里做一些校驗或修飾工作等】,而不會影響依賴于該屬性的代碼】
        3.索引器
         C#通過提供索引器,可以象處理數(shù)組一樣處理對象。特別是屬性,每一個元素都以一個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.委托
         委托可以被認(rèn)為是類型安全的、面向?qū)ο蟮暮瘮?shù)指針,它可以擁有多個方法。委托處理的問題在C++中可以用函數(shù)指針處理,而在Java中則可以用接口處理。它通過提供類型安全和支持多方法改進了函數(shù)指針方式;它通過可以進行方法調(diào)用而不需要內(nèi)部類適配器或額外的代碼去處理多方法調(diào)用問題而改進了接口方式。委托最重要用途是事件處理,下一節(jié)將通過一個例子加以介紹。
        5.事件
         C#提供了對事件的直接支持。盡管事件處理一直是編程的基本部分,但令人驚訝的是,大多數(shù)語言在正式化這個概念上所做的努力都微乎其微。如果看看現(xiàn)今主流框架是如何處理事件的,我們可以舉出如下例子:Delphi的函數(shù)指針(稱為閉包)和Java的內(nèi)部類適配器,當(dāng)然還有Windows API消息系統(tǒng)。C#使用delegate和event關(guān)鍵字提供了一個清爽的事件處理方案。我認(rèn)為描述這個機制的最好的辦法是舉個例子來說明聲明、觸發(fā)和處理事件的過程:
        // 委托聲明定義了可被調(diào)用的方法簽名【譯注:這里的簽名可以理解為“原型”】
        public delegate void ScoreChangeEventHandler (int newScore, ref bool cancel);
        // 產(chǎn)生事件的類
        public class Game
        {
        //注意使用關(guān)鍵字
        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)
        {
        // 監(jiān)視game中的score的分?jǐn)?shù)改變
        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!】
         &nb

        溫馨提示:喜歡本站的話,請收藏一下本站!

        本類教程下載

        系統(tǒng)下載排行

        主站蜘蛛池模板: 激情吃奶吻胸免费视频xxxx| 中文字幕亚洲情99在线| 一区二区三区免费看| 免费在线看片网站| 免费看一级毛片在线观看精品视频| www国产亚洲精品久久久| 菠萝菠萝蜜在线免费视频| 亚洲七七久久精品中文国产| 一区二区三区免费视频播放器| 亚洲精品少妇30p| 99re免费99re在线视频手机版| 亚洲av永久无码精品天堂久久 | 亚洲天堂中文字幕| 久久国产免费福利永久| 天堂亚洲国产中文在线| 国产传媒在线观看视频免费观看 | 亚洲精品成人久久| 久久综合AV免费观看| 老司机亚洲精品影院在线观看| 国产亚洲精品免费视频播放| 麻豆精品成人免费国产片| 亚洲国产精品久久网午夜| 在线视频免费国产成人| 久久精品免费大片国产大片| 亚洲欧洲自拍拍偷综合| 免费日韩在线视频| 久久这里只精品99re免费| 亚洲色大成WWW亚洲女子| 亚洲精品成人a在线观看| 久久免费福利视频| 无码一区二区三区亚洲人妻| 国产AV无码专区亚洲A∨毛片| 在线观看日本免费a∨视频| 人人爽人人爽人人片A免费| 亚洲欧洲在线观看| 国产人成免费视频| 一级毛片aaaaaa免费看| 午夜亚洲国产精品福利| 亚洲黄色免费观看| 亚洲精品国产精品国自产观看| 亚洲精品视频在线免费|