<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    走在架構師的大道上 Jack.Wang's home

    Java, C++, linux c, C#.net 技術,軟件架構,領域建模,IT 項目管理 Dict.CN 在線詞典, 英語學習, 在線翻譯

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      195 Posts :: 3 Stories :: 728 Comments :: 0 Trackbacks
    很多人說C#是微軟用來和Java抗衡的武器,因為二者在很大程度上有著驚人的相似
    ,盡管如此,兩者不同的地方也很多,所謂“于細微處見差異”。那么兩者的相似和區
    別都在什么地方呢?我們從今天開始,會從各個角度來對比C#和Java的特點,希望能對
    正在學習、使用C#的朋友有所幫助。
    1、C#和.NET平臺的概貌
      2000年6月,微軟發布C#語言和.NET平臺。C#語言是一種強類型的,面向對象的語言
    ,它具有語法簡單、表達力強的特點,而.NET平臺則是構成微軟的“.NET計劃”的基石

      .NET平臺的核心包括兩方面,一方面就是著名的通用語言運行機(Common Language
    Runtime),雖然這個名詞起得晦澀了點,不過大家可以拿它和Java的虛擬機來作比較,
    二者完成的任務大致相同;另一方面就是一大堆通用函數庫,這些庫函數可以被多種語
    言調用,并且通過編譯都產生一種共同的中間語言(Intermediate Language),這種語
    言也可以拿Java的字節碼來類比,雖然完成的方式有些不一樣。
    2、C#和Java
      下面簡單地把C#和Java的相似處列出來,雖然在這里我們重點討論的是C#和Java的
    不同點,但是了解一下二者的相同之處也是很有必要的。
      二者都編譯成跨平臺的、跨語言的代碼,并且代碼只能在一個受控制的環境中運行

      自動回收垃圾內存,并且消除了指針(在C#中可以使用指針,不過必須注明unsafe
    關鍵字)
      都不需要頭文件,所有的代碼都被“包(package)”限制在某個范圍內,并且因為沒
    有頭文件,所以消除了類定義的循環依賴
      所有的類都是從對象派生出來,并且必須使用New關鍵字分配內存
      用對象加鎖的方式來支持多線程
      都具有接口(interface)的概念
    內部類
      繼承類的時候不會以某種特定的訪問權限來繼承;
      沒有全局函數或者常量,一切必須屬于類;
      數組或者字符串都自帶長度計算和邊界檢查;
      只使用“.”操作符,沒有“->”和“::”;
      “null”、“boolean”和“bool”成為了關鍵字;
      任何變量均在使用前進行初始化;
      不能使用整數來返回到if條件語句中,必須使用布爾值;
      “Try”模塊后可以有“finally” ;
    3. 屬性(Property)
      屬性的概念對大家來說應該是很熟悉的,類成員函數可以自由地訪問本類中的任何
    屬性成員。不過若要從一個類中去訪問另一個類中的屬性,那就比較麻煩了,所以很多
    時候我們使用Getxxx和Setxxx方法,這樣看起來顯得極不自然,比如用Java或者C++,代
    碼是這樣的:
      foo.setSize (getSize () + 1);
      label.getFont().setBold (true);
      但是,在C#中,這樣的方法被“屬性化”了。同樣的代碼,在C#就變成了:
      foo.size++;
      label.font.bold = true;
      可以看出來,C#顯然更容易閱讀和理解。我們從這個“屬性方法”的子程序代碼中
    ,也可以看到類似情況:
    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#中把屬性成員稱作“域(field)”
    ,而“屬性”則成為這種“屬性化的方法”專用的名詞。順便說一句,其實這樣的屬性
    化方法在VB和DELPHI中是經常碰到的,在VB中它也就叫屬性。
      另外,在C#中Get和Set必須成對出現,一種屬性不能只有Get而沒有Set(在Java和
    C++中就可以只有Get或者只有Set),C#中這樣做的好處在于便于維護,假如要對某種屬
    性進行修改,就會同時注意Get和Set方法,同時修改,不會改了這個忘了那個。
    4、對象索引機制(Indexer)
      C#中引入了對象索引機制。說得明白點,對象索引其實就是對象數組。這里和上一
    節中的屬性聯系起來講一下,屬性需要隱藏Get和Set方法,而在索引機制中,各個對象
    的Get或者Set方法是暴露出來的。比如下面的例子就比較清楚地說明了這一點。
    public class Skyscraper
    {
     Story[] stories;
     public Story this [int index] {
      get {
       return stories [index];
      }
      set {
       if (value != null) {

        stories [index] = value;
       }
      }
     }
    ...
    }
    5. 指代(Delegate)
      指代這個玩意很特別,它有點象指針,但又不完全是,不過大家還是可以把它理解
    為一種類型安全的、面向對象的指針。(什么是類型安全和面向對象就不用講了吧?)
    順便提一句,有很多書上把Delegate翻譯成代理,我覺得這樣翻不夠確切,翻譯成“指
    代”更恰當些,道理上吻合,并且還符合它的本來意思——微軟本來就是用Delegate來
    “取代指針”,所以叫“指代”,呵呵。
      說起指代,也許至今Sun還會對它憤憤不已,為什么呢?因為在Sun的標準Java中是
    沒有這個東西的,它是微軟99年發布的MSVJ++6添加的“新特性”。為此,兩家公司吵得
    不亦樂乎,并且還專門在網上寫了大量文章互相攻擊,有興趣的朋友可以去看看(只有
    英文版)。
    http://www.Javasoft.com/docs/white/delegates.html
    http://msdn.microsoft.com/visualj/technical/articles/delegates/truth.asp
      話歸正傳,指代有什么特點呢?一個明顯的特點就是它具有了指針的行為,就好象
    從Java又倒回到了C++。在C#中,指代完成的功能大概和C++里面的指針,以及Java中的
    接口相當。但是,指代比起C++的“正宗指針”來又要高明一些,因為它可以同時擁有多
    個方法,相當于C++里面的指針能同時指向多個函數,并且是類型安全的,這一點體現了
    它的“對象”特性;而比起Java的接口來,指代高明的地方在于它能可以不經過內部類
    就調用函數,或者用少量代碼就能調用多種函數,這一點體現了它的“指針”特性。呵
    呵,很有“波粒二象性”的味道吧?指代最重要的應用在于對于事件的處理,下一節我
    們將重點介紹。
    6、事件(Event)
      C#對事件是直接支持的(這個特點也是MSVJ所具有的)。當前很多主流程序語言處
    理事件的方式各不相同,Delphi采用的是函數指針(這在Delphi中的術語是“closure”
    )、Java用改編類來實現、VC用WindowsAPI的消息系統,而C#則直接使用delegate和ev
    ent關鍵字來解決這個問題。下面讓我們來看一個例子,例子中會給大家舉出聲明、調用
    和處理事件的全過程。
    //首先是指代的聲明,它定義了喚醒某個函數的事件信號
    public delegate void ScoreChangeEventHandler (int newScore, ref bool cancel)
    ;
    //定義一個產生事件的類
    public class Game
    {
     // 注意這里使用了event關鍵字
     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.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;
      game.Score = 110;
     }
    }
      在主函數中,我們創建了一個game對象和一個裁判對象,然后我們通過改變比賽分
    數,來觀察裁判對此會有什么響應。
      請注意,我們的這個系統中,Game對象是感覺不到裁判對象的存在的,Game對象在
    這里只負責產生事件,至于有誰會來傾聽這個事件,并為之作出反應,Game對象是不作
    任何表態的。
      我們注意到,在裁判類的Referee函數中,Game.ScoreChange后面使用了+=和-=操作
    符,這是什么意思呢?回到我們定義ScoreChange的地方,可以發現ScoreChange是用ev
    ent關鍵字修飾的,那么這里的意思就很明白了:ScoreChange是一個事件,而事件被觸
    發后需要相應的事件處理機制,+=/-=就是為這個事件增加/移除相對應的事件處理程序
    ,而且,并不是一個事件只能對應一個處理程序,我們還可以用這兩個操作符為同一事
    件增加/移除數個事件處理程序。怎么樣?很方便吧!
      在實際應用中,和我們上面講的(競賽-裁判)機制很相近的系統就是圖形用戶界面
    系統了。Game對象可以看作是圖形界面上的小零件,而得分事件就相當于用戶輸入事件
    ,而裁判就相當于相應的應用程序,用于處理用戶輸入。
      指代機制的首次亮相是在MSVJ里,它是由Anders Hejlsberg發明的,現在又用到了
    C#中。指代用在Java語言中的后果,則直接導致了微軟和Sun之間對類和指針的關系產生
    了大量的爭論和探討。有意思的是,Java的發明者James Gosling非常幽默地稱呼指代的
    發明者Anders Hejlsberg為“‘函數指針’先生”,因為Anders Hejlsberg總是想方設
    法地把指針變相地往各種語言中放;不過有人在看了Java中大量地使用了各種類后,也
    戲稱Java的發明者James Gosling為“‘全都是類’先生”,真是其中滋味,盡在不言中
    啊。




    本博客為學習交流用,凡未注明引用的均為本人作品,轉載請注明出處,如有版權問題請及時通知。由于博客時間倉促,錯誤之處敬請諒解,有任何意見可給我留言,愿共同學習進步。
    posted on 2008-04-19 20:51 Jack.Wang 閱讀(27284) 評論(13)  編輯  收藏 所屬分類: 開發技術

    Feedback

    # re: C#與Java之比較[未登錄] 2008-04-19 21:19 GoKu
    C# 3.0 增加了很多東西,但是也增加了語言復雜度,有點適得其反的感覺,其實為了更易看懂,我們不在乎多寫一句代碼  回復  更多評論
      

    # re: C#與Java之比較[未登錄] 2008-04-19 21:39 Matthew Chen
    在C#中Get和Set不一定成對出現,只要最少包含一個就夠了。  回復  更多評論
      

    # re: C#與Java之比較[未登錄] 2008-04-19 22:02 GoKu
    只讀屬性可以只包含set  回復  更多評論
      

    # re: C#與Java之比較[未登錄] 2008-04-19 22:03 GoKu
    是get...  回復  更多評論
      

    # re: C#與Java之比較 2008-04-19 23:27 astamei
    http://www.25hoursaday.com/CsharpVsJava.html


    樓主總結的非常棒,
    我以前看過一個e文的比較很全面 (如上鏈接)  回復  更多評論
      

    # re: C#與Java之比較 2008-04-21 09:44 mrf
    C#的內部類沒有Java的方便!  回復  更多評論
      

    # re: C#與Java之比較 2008-04-21 09:53 阿里
    C#跟Java比生來就具有跟Win 32 Api交互的優勢,能跟Windows的dll順暢溝通。  回復  更多評論
      

    # re: C#與Java之比較 2008-04-21 09:56 raof01
    "在C#中Get和Set必須成對出現,一種屬性不能只有Get而沒有Set"——C#可以有單個Get或Set。  回復  更多評論
      

    # re: C#與Java之比較 2008-04-22 03:28 HanLab
    @阿里
    同意,用java native訪問動態鏈接庫函數有點頭疼。  回復  更多評論
      

    # re: C#與Java之比較 2008-04-22 11:57 Jack.Wang
    可以看看我寫的那個 JNI 編程,其實也很不錯的!
    java 和 C++ 互調  回復  更多評論
      

    # re: C#與Java之比較 2008-08-06 00:21 whust
    巨大的同感啊,java里調用系統DLL太困難了@阿里
      回復  更多評論
      

    # re: C#與Java之比較 2010-11-16 23:09 純粹路過的
    @阿里
    因為WIN32上的虛擬機就是C++實現的,函數庫自然是扔DLL了,JDK自帶的NATIVE方法指引著你瞄瞄JDK帶的DLL。  回復  更多評論
      

    # re: C#與Java之比較 2014-07-17 10:33 twlkyao
    應該是只包含get吧。@GoKu
      回復  更多評論
      

    主站蜘蛛池模板: a级成人毛片免费视频高清| 在线观看日本亚洲一区| 免费在线观看毛片| 成人黄软件网18免费下载成人黄18免费视频| 永久免费A∨片在线观看| 亚洲第一视频在线观看免费| 日韩成人精品日本亚洲| 亚洲色大情网站www| 色妞www精品视频免费看| 美景之屋4在线未删减免费| 一区二区三区视频免费观看| 一级做a爰片久久毛片免费陪| 国产成人亚洲精品播放器下载| 亚洲AV综合永久无码精品天堂| 亚洲人成人无码.www石榴| 亚洲日本VA中文字幕久久道具| 污网站在线免费观看| 一二三四在线观看免费中文在线观看| 中国人免费观看高清在线观看二区| 中文字幕免费在线看| 毛片免费全部播放无码| 青青视频观看免费99| 无码人妻精品一二三区免费| 亚洲精品视频在线观看你懂的| 亚洲日本中文字幕一区二区三区 | 免费A级毛片无码视频| 国产精品免费无遮挡无码永久视频 | 国内精品免费视频自在线| 成人免费a级毛片无码网站入口| 亚洲国产综合精品一区在线播放| 亚洲天天做日日做天天看| 亚洲成aⅴ人在线观看| 日韩亚洲国产综合高清| 精品亚洲国产成人av| 久久国产精品免费观看| 日韩中文字幕在线免费观看| 亚洲天堂免费在线视频| 亚洲av无码片区一区二区三区 | 亚洲天天做日日做天天看| 国产大陆亚洲精品国产| 亚洲一区二区三区免费观看|