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

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

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

    302班

    java突擊隊(duì)
    posts - 151, comments - 74, trackbacks - 0, articles - 14
      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
      每隔10年左右,編程人員就需要花費(fèi)大量的時(shí)間和精力去學(xué)習(xí)新的編程技術(shù)。在80年代是Unix和C,90年代是Windows和C++,現(xiàn)在又輪到了微軟的。NETFramework和C #.盡管需要學(xué)習(xí)新的技術(shù),但由此帶來(lái)的好處卻遠(yuǎn)高于付出的勞動(dòng)。幸運(yùn)的是,使用C#和。NET進(jìn)行的大多數(shù)工程的分析和設(shè)計(jì)與在C++和Windows中沒(méi)有本質(zhì)的變化。在本篇文章中,我將介紹如何實(shí)現(xiàn)由C++到C#的飛躍。

        已經(jīng)有許多文章介紹過(guò)C#對(duì)C++的改進(jìn),在這里我就不再重復(fù)這些問(wèn)題了。在這里,我將重點(diǎn)討論由C++轉(zhuǎn)向C#時(shí)最大的變化:由不可管理的環(huán)境向可管理的環(huán)境的變化。此外,我還會(huì)提出一些C#編程人員容易犯的錯(cuò)誤供大家參考,此外,還將說(shuō)明一些C#語(yǔ)言的能夠影響編程的新功能。

        轉(zhuǎn)向可管理的環(huán)境

        C++的設(shè)計(jì)目標(biāo)是低級(jí)的、與平臺(tái)無(wú)關(guān)的面向?qū)ο缶幊陶Z(yǔ)言,C#則是一種高級(jí)的面向組件的編程語(yǔ)言。向可管理環(huán)境的轉(zhuǎn)變意味著你編程方式思考的重大轉(zhuǎn)變,C#不再處理細(xì)微的控制,而是讓架構(gòu)幫助你處理這些重要的問(wèn)題。例如,在C++中,我們就可以使用new在棧中、堆中、甚至是內(nèi)存中的某一特定位置創(chuàng)建一個(gè)對(duì)象。

        在。NET的可管理環(huán)境中,我們?cè)俨挥眠M(jìn)行那樣細(xì)微的控制了。在選擇了要?jiǎng)?chuàng)建的類(lèi)型后,它的位置就是固定的了。簡(jiǎn)單類(lèi)型(ints、double和long)的對(duì)象總是被創(chuàng)建在棧中(除非它們是被包含在其他的對(duì)象中),類(lèi)總是被創(chuàng)建在堆中。我們無(wú)法控制對(duì)象是創(chuàng)建在堆中哪個(gè)位置的,也沒(méi)有辦法得到這個(gè)地址,不能將對(duì)象放置在內(nèi)存中的某一特定位置。(當(dāng)然也有突破這些限制的方法,但那是很另類(lèi)的方法。)我們?cè)僖膊荒芸刂茖?duì)象的生存周期,C#沒(méi)有destructor.碎片收集程序會(huì)將對(duì)象所占用的內(nèi)存進(jìn)行回收,但這是非顯性地進(jìn)行的。

        正是C#的這種結(jié)構(gòu)反映了其基礎(chǔ)架構(gòu),其中沒(méi)有多重繼承和模板,因?yàn)樵谝粋€(gè)可管理的碎片收集環(huán)境中,多重繼承是很難高效地實(shí)現(xiàn)的。

        C#中的簡(jiǎn)單類(lèi)型僅僅是對(duì)通用語(yǔ)言運(yùn)行庫(kù)(CLR)中類(lèi)型的簡(jiǎn)單映射,例如,C#中的int是對(duì)System.Int32的映射。C#中的數(shù)據(jù)類(lèi)型不是由語(yǔ)言本身決定的,而是由CLR決定的。事實(shí)上,如果仍然想在C#中使用在VisualBasic中創(chuàng)建的對(duì)象,就必須使自己的編程習(xí)慣更符合CLR的規(guī)定。

        另一方面,可管理的環(huán)境和CLR也給我們帶來(lái)了好處。除了碎片收集和所有。NET語(yǔ)言中統(tǒng)一的數(shù)據(jù)類(lèi)型外,它還提供給我們一個(gè)功能強(qiáng)大的面向組件的編程語(yǔ)言,無(wú)須對(duì)后期綁定提供特別的支持,類(lèi)型發(fā)現(xiàn)和后期綁定都是被內(nèi)置在語(yǔ)言中的。屬性是C#語(yǔ)言中的第一類(lèi)的成員,事件和代理也是。

        可管理環(huán)境最主要的優(yōu)點(diǎn)是。NETFramework.盡管在所有的。NET語(yǔ)文中都可以使用這種框架,但C#可以更好地使用。NET框架中豐富的類(lèi)、接口和對(duì)象。

        Traps

        C#看起來(lái)與C++非常相似,這使得我們?cè)谟蒀++轉(zhuǎn)向C#時(shí)比較輕松,但其中也有一些容易出錯(cuò)的地方。在C++中編寫(xiě)得非常漂亮的代碼,在C#中會(huì)不能通過(guò)編譯,甚至?xí)霈F(xiàn)意想不到的結(jié)果。C#與C++之間在語(yǔ)法上的變化并不大,編譯器能夠發(fā)現(xiàn)這二者之間大部分的差異,我在這里就不再多費(fèi)筆墨了,在這里我介紹幾個(gè)容易出問(wèn)題的比較重要的變化:

        引用類(lèi)型和值類(lèi)型

        在C#中,值類(lèi)型和引用類(lèi)型數(shù)據(jù)是有區(qū)別的。簡(jiǎn)單類(lèi)型(int、long、double等)和結(jié)構(gòu)屬于值類(lèi)型數(shù)據(jù),類(lèi)和對(duì)象屬于引用類(lèi)型數(shù)據(jù)。除非是包含在引用類(lèi)型的變量中,與在C++中一樣,值類(lèi)型變量的值存儲(chǔ)在棧中。引用類(lèi)型的變量也存儲(chǔ)在棧中,但它的值是一個(gè)存儲(chǔ)在堆中的對(duì)象的地址,這一點(diǎn)也與C++類(lèi)似。值類(lèi)型變量是將自己的值傳遞給方法,而引用類(lèi)型變量則將自己的指針傳遞給方法。

      結(jié)構(gòu)

        C#中的結(jié)構(gòu)與C++中有非常明顯的區(qū)別。在C++中,結(jié)構(gòu)更象是類(lèi),除了缺省的繼承外,其缺省的訪(fǎng)問(wèn)權(quán)限是public而不是private.在C#中,結(jié)構(gòu)與類(lèi)截然不同,它是用來(lái)封裝輕型對(duì)象的,是值類(lèi)型的數(shù)據(jù)類(lèi)型,在傳遞時(shí)傳送的是變量的值,而不是其地址。此外,它們也有一些不適用于類(lèi)的限制,例如,它是不能繼承的,也沒(méi)有除System.ValueType之外的基本類(lèi)。結(jié)構(gòu)還不能定義一個(gè)缺省的constructor.

        另一方面,由于結(jié)構(gòu)比類(lèi)的效率要高,因此它非常適合于創(chuàng)建輕型對(duì)象。因此,如果它的缺點(diǎn)對(duì)你的軟件沒(méi)有影響,使用結(jié)構(gòu)比使用類(lèi)效率要高得多,尤其是對(duì)于小對(duì)象而言。

      所有的一切都是對(duì)象

      在C#中,所有的東西都是由繼承Object得到的,包括創(chuàng)建的類(lèi)和int、structs等值類(lèi)型的變量。Object類(lèi)提供了一些有用的方法,例如ToString,使用ToString的一個(gè)例子是與System.Console.WriteLine一起使用,它可以接受一個(gè)字符串和許多對(duì)象。與使用printf語(yǔ)句不同,要使用WriteLine,需要提供代換變量。假設(shè)myEmployee是用戶(hù)定義的Employee類(lèi)的一個(gè)實(shí)例,myCounter是用戶(hù)定義的Counter類(lèi)的一個(gè)實(shí)例:


      Console.WriteLine("Theemployee:{0},thecountervalue:{1}",
      myEmployee,myCounter);

     

      其中的WriteLine會(huì)調(diào)用每個(gè)對(duì)象的Object.ToString方法,替換作為參數(shù)返回的變量。如果Employee類(lèi)不覆蓋ToString,就會(huì)調(diào)用缺省的實(shí)現(xiàn)(由System.Object繼承得到的),它將把類(lèi)的名字作為一個(gè)字符串返回。Counter會(huì)覆蓋ToString,返回一個(gè)整型的變量,因此,上面代碼的輸出為:


      Theemployee:Employee,thecountervalue:12

      如果向WriteLine傳遞一個(gè)整型變量會(huì)發(fā)生什么情況呢?由于不能對(duì)整型變量調(diào)用ToString,編譯器將自動(dòng)將整型變量封裝在一個(gè)對(duì)象的實(shí)例中。當(dāng)WriteLine調(diào)用ToString時(shí),對(duì)象就會(huì)返回表示整型變量值的字符串。下面的代碼就說(shuō)明了這個(gè)問(wèn)題:

      類(lèi)的使用


      usingSystem;
      //不覆蓋ToString的類(lèi)
      publicclassEmployee
      {
      }
      //覆蓋了ToString的類(lèi)
      publicclassCounter
      {
      privateinttheVal;
      publicCounter(inttheVal)
      {
      this.theVal=theVal;
      }
      publicoverridestringToString()
      {
      Console.WriteLine("CallingCounter.ToString()");
      returntheVal.ToString();
      }
      }


      publicclassTester
      {
      publicstaticvoidMain()
      {
      //創(chuàng)建類(lèi)的實(shí)例
      Testert=new
    Tester();
      //調(diào)用非靜態(tài)成員
      //(mustbethroughaninstance)
      t.Run();
      }
      //演示調(diào)用ToString的非靜態(tài)方法
      publicvoidRun()
      {
      EmployeemyEmployee=newEmployee();
      CountermyCounter=newCounter(12);
      Console.WriteLine("Theemployee:{0},thecountervalue:{1}",
      myEmployee,myCounter);
      intmyInt=5;
      Console.WriteLine("Herearetwointegers:{0}and{1}",17,myInt);
      }
      }

     

      引用型參數(shù)和輸出型參數(shù)

      與C++中相同,C#中的方法也只能有一個(gè)返回值。在C++中,我們通過(guò)將指針或索引作為參數(shù)而克服了這個(gè)限制,被調(diào)用的方法改變其中的參數(shù),調(diào)用方法就可以得到新的值了。

      向方法中傳遞一個(gè)索引作為參數(shù)時(shí),只能?chē)?yán)格地按傳遞索引或指針?biāo)軌蛱峁┑姆绞皆L(fǎng)問(wèn)原來(lái)的對(duì)象。對(duì)于值類(lèi)型變量而言,就不能采用這種方法了。如果要通過(guò)引用型參數(shù)傳遞值型變量,就需要在其前面加上ref關(guān)健字。如下所示:


      publicvoidGetStats(refintage,refintID,refintyearsServed)

      需要注意的是,既需要在方法的定義中使用ref關(guān)健字,也需要在對(duì)方法的實(shí)際調(diào)用中使用ref關(guān)健字。


      Fred.GetStats(refage,refID,refyearsServed);

      現(xiàn)在,我們可以在調(diào)用方法中定義age、ID和yearsServed變量,并將它們傳遞給GetStats,得到改變后的值。

      C#要求明確的賦值,也就是說(shuō),在調(diào)用GetStats方法之前,必須對(duì)age、ID和yearsServed這三個(gè)局部變量進(jìn)行初始化,這一工作似乎有點(diǎn)多余,因?yàn)槲覀儍H僅使用它們從GetStats中得到新的變量的值。為了解決這一問(wèn)題,C#提供了out關(guān)健字,表示我們可以向方法中傳遞沒(méi)有被初始化的變量,這些變量將通過(guò)引用變量的方式進(jìn)行傳遞:


      publicvoidGetStats(outintage,outintID,outintyearsServed)

      當(dāng)然了,調(diào)用方法也必須作出相應(yīng)的變化:


      Fred.GetStats(outage,outID,outyearsServed);


    只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲午夜在线播放| 国产亚洲人成在线影院| 女人张腿给男人桶视频免费版| 亚洲a∨国产av综合av下载| 中文字幕亚洲无线码| 久久w5ww成w人免费| 国产精品亚洲lv粉色| 亚洲AV永久无码精品水牛影视| 午夜性色一区二区三区免费不卡视频 | 国产亚洲精品自在线观看| 久久中文字幕免费视频| 亚洲精品天堂成人片AV在线播放| 久久久久亚洲精品无码网址 | 亚洲日韩av无码中文| 亚洲午夜福利AV一区二区无码| 最近中文字幕2019高清免费| 看亚洲a级一级毛片| 亚洲黄色网址大全| 亚洲国产成人久久一区WWW| 在线人成精品免费视频| 少妇亚洲免费精品| 亚洲一区中文字幕| 亚洲精品成人片在线观看精品字幕 | 18勿入网站免费永久| 国产精品永久免费| 亚洲中文字幕久久精品无码VA| 亚洲日韩aⅴ在线视频| 精品剧情v国产在免费线观看| 天堂在线免费观看| 女bbbbxxxx另类亚洲| 亚洲精品二三区伊人久久| 精品亚洲永久免费精品| 又粗又大又长又爽免费视频| 免费看黄视频网站| 免费精品无码AV片在线观看| jizz免费一区二区三区| 337P日本欧洲亚洲大胆艺术图 | 国产91精品一区二区麻豆亚洲| 最近2019中文字幕mv免费看| 少妇无码一区二区三区免费| 国产99视频精品免费视频76|