編程: 微軟比較流行使用的 十種編程語言盤點點評
  • 6樓 Re: 編程: 微軟比較流行使用的 十種編程語言盤點
  • 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)的概念

      內部類

    繼承類的時候不會以某種特定的訪問權限來繼承;

      沒有全局函數或者常量,一切必須屬于類;

      數組或者字符串都自帶長度計算和邊界檢查;

      只使用“.”操作符,沒有“-$#@62;”和“::”;

      “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;
        }
      }
      }
    ...
    }
    Skyscraper empireState = new Skyscraper (...);
    empireState [102] = new Story ("The Top One", ...);
      呵呵,有了這種特性,我們就再不用怕課堂上老師叫我們寫對象數組這種程序了。

      . 指代(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和even
  • 作者:aaaa 2009-12-1 17:04:00
  • 4樓 Re: 編程: 微軟比較流行使用的 十種編程語言盤點
  • 首先,工具欄里面的不是函數,而是控件^^
    其次,函數不需要一個個地去學,也不推薦這么學,買本書,做實例,需要用函數的時候到網上搜索,用過一次以后就記住它,日積月累,就什么都記住了
    PS:其實我們所說的函數,大部分都是自己根據需要寫的,系統提供的都是些類型轉換為主的函數。。。
  • 作者:大摩機手 2009-12-1 16:18:00
  • 3樓 Re: 編程: 微軟比較流行使用的 十種編程語言盤點
  • 新手的話,那就可以不用去管什么工具欄,對于c#的IDE就用Visual studio
    經常接觸工具漸漸地就熟悉了
    先好好的把c#語言本身以及面向對象的思想弄懂
    去哪里弄本c#的入門書,認認真真地看下去,看完每個知識點要上機實踐一下
    入門看差不多了,就看高級編程,平時自己可以出一些題目給自己,
    還可以考慮開發一些對新手而言比較有挑戰但是又可以完成的項目
    其實就是多接觸,多編程,多思考,慢慢的你也就成為一名高手了

    下面貼的是從百度貼吧c#吧的置頂帖里的內容:
    如果你想學好C#!就一定要看這個!對你很多幫助! 
    .把C#當成一門新的語言學習; 
    .看《C#入門經典》和《C#高級編程》; 
    .不要被VC、BCB、BC、MC、TC等詞匯所迷惑——他們都是集成開發環境,而我們要學的是一門語言; 
    .不要放過任何一個看上去很簡單的小編程問題——他們往往并不那么簡單,或者可以引伸出很多知識點 
    .會用Visual vs,并不說明你會C#; 
    .學c#并不難,長期堅持實踐和不遺余力的博覽群書; 
    .如果不是天才的話,想學編程就不要想玩游戲!
    .看Visual vs的書,是學不了C#語言的; 
    .浮躁的人容易說:XX語言不行了,應該學YY;——是你自己不行了吧!? 
    .浮躁的人容易問:我到底該學什么;——別問,學就對了; 
    .浮躁的人容易問:XX有錢途嗎;——建議你去搶銀行; 
    .浮躁的人容易問:XX和YY哪個好;——告訴你吧,都好——只要你學就行; 
    .浮躁的人分兩種:a)只觀望而不學的人;b)只學而不堅持的人; 
    .把時髦的技術掛在嘴邊,還不如把過時的技術記在心里; 
    .C#不僅僅是支持面向對象的程序設計語言; 
    .學習編程最好的方法之一就是閱讀源代碼; 
    .在任何時刻都不要認為自己手中的書已經足夠了; 
    .看得懂的書,請仔細看;看不懂的書,請硬著頭皮看; 
    .別指望看第一遍書就能記住和掌握什么——請看第二遍、第三遍; 
    .和別人一起討論有意義的C#知識點,而不是爭吵XX行不行或者YY與ZZ哪個好; 
    .請不要認為學過XX語言再改學C#會有什么問題——你只不過又在學一門全新的語言而已 
    .讀完了《C#高級編程》以后再來認定自己是不是已經對C#入門了; 
    .學習編程的秘訣是:編程,編程,再編程; 
    .記住:面向對象技術不只是C#專有的; 
    .請把書上的程序例子親手輸入到電腦上實踐,即使配套光盤中有源代碼; 
    .把在書中看到的有意義的例子擴充; 
    .請重視C#中的異常處理技術,并將其切實的運用到自己的程序中; 
    .經常回顧自己以前寫過的程序,并嘗試重寫,把自己學到的新知識運用進去; 
    .不要漏掉書中任何一個練習題——請全部做完并記錄下解題思路; 
    .C#語言和C#的集成開發環境要同時學習和掌握; 
    .既然決定了學C#,就請堅持學下去,因為學習程序設計語言的目的是掌握程序設計技術,而程序設計技術是跨語言的; 
    .就讓C#語言的各種平臺和開發環境去激烈的競爭吧,我們要以學習C#語言本身為主; 
    .當你寫C#程序寫到一半卻發現自己用的方法很拙劣時,請不要馬上停手;請盡快將余下的部分粗略的完成以保證這個設計的完整性,然后分析
    自己的錯誤并重新設計和編寫; 
    .決不要因為程序“很小”就不遵循某些你不熟練的規則——好習慣是培養出來的,而不是一次記住的; 
    .每學到一個C#難點的時候,嘗試著對別人講解這個知識點并讓他理解——你能講清楚才說明你真的理解了; 
    .記錄下在和別人交流時發現的自己忽視或不理解的知識點; 
    .請不斷的對自己寫的程序提出更高的要求,哪怕你的程序版本號會變成XX; 
    .保存好你寫過的所有的程序——那是你最好的積累之一; 
    .請不要做浮躁的人
    .請熱愛C#!
  • 作者:他老公 2009-12-1 15:49:00
首頁 | 前頁 | 后頁 | 尾頁分頁 1/1 [1]

點評
字數0
姓名
  • ·尊重網上道德,遵守中華人民共和國的各項有關法律法規 ·承擔一切因您的行為而直接或間接導致的民事或刑事法律責任 ·本站管理人員有權保留或刪除其管轄留言中的任意內容 ·本站有權在網站內轉載或引用您的評論 ·參與本評論即表明您已經閱讀并接受上述條款