posts - 403, comments - 310, trackbacks - 0, articles - 7
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          C# 學習筆記 (1)

          Posted on 2008-04-02 23:33 ZelluX 閱讀(1548) 評論(14)  編輯  收藏 所屬分類: OOP
          這語言真不錯,不像Java那么呆,可惜不開源。
          入門看的書是CLR via C#中文版,翻譯質(zhì)量不錯,起碼到現(xiàn)在還沒覺得有必要翻一翻原版(不過為什么中文書都喜歡把“棧”叫成“堆棧”呢)。
          前面幾章粗略看了下,從第四章類型基礎開始重點閱讀。
          繼續(xù)漫無目的的學習感興趣的東西,學習之中經(jīng)常會驚喜的發(fā)現(xiàn),自己看問題的角度已經(jīng)不同于之前了。

          1. 類的new操作會遞歸調(diào)用該類的所有父類構造器,直到System.Object,后者的構造器只是簡單返回,用ILDasm查看MSCorLib.dll可以證實這一點。

          2. is和as操作符,is類似于Java中的instanceof,as會先檢查類型,如果兼容返回該對象的引用,反之返回null。
          Emplooee?e?=?o?as?Employee;
          if?(e?!=?null)?{
          ????
          //?blah
          }
          利用as可以做到只檢驗一次對象類型,提高程序性能。這本書的很多地方都提到了性能因素。

          3. 方法調(diào)用和x86上匯編語言調(diào)用機制很類似。先是參數(shù)入棧,接著返回地址入棧,返回的時候也差不多。不知道x64等寄存器較多的架構上會不會使用寄存器傳參呢,呵呵。

          4. 作為方法的prologue的一部分,CLR會自動將所有局部變量初始化為null或0。感覺這個自動初始化沒什么必要,在第五章可以看到。
          SomeVal?v1;
          SomeVal?v1?
          =?new?SomeVal();
          這里的SomeVal都是值類型,CLR都會將它們初始化為0。區(qū)別在于C#認為前者沒有初始化,直接使用這個值會報錯;而后者在不賦值的情況下使用這個值。
          可能這是CLR和C#之間不統(tǒng)一導致的冗余步驟吧。

          5. CLR開始在一個進程中運行時,會給System.Type類型創(chuàng)建一個實例,每個類都會包含指向System.Type類型的指針。

          6. CLR提供了執(zhí)行溢出檢查的計算指令,例如add.ovf對應add,mul.ovf對應mul。C#中默認關閉溢出檢查。
          可以使用checked關鍵字使用溢出檢查。一般情況下,對預計可能發(fā)生溢出的代碼放到checked塊中,對允許溢出的代碼(比如計算hash值)放到一個unchecked塊中,其他情況,Debug時打開編譯器的/checked+開關,Release版本關閉。

          7. 所有的值類型都是從System.ValueType繼承的。后者重寫了Equals方法,比較兩個值對象是否完全相等。

          8. boxing和unboxing。
          boxing:托管堆中分配內(nèi)存,復制值類型,然后返回對象地址。
          unboxing:相當于一個通過指針取值的過程,不過這個指針是已裝箱部分中的實際值部分。

          9. FCL(Framework Class Library)中包含了支持值類型的泛型容器類,不需要對容器中的元素進行boxing/unboxing處理。
          不過這里就有個問題了,值類型的話是放在棧上的,生命周期小于容器的,這個怎么處理呢?
          第16章才詳細解釋泛型,先把這個問題留著吧 =,=

          10. 依然是性能問題。有時候編譯器會反復對一個值類型boxing,此時手動boxing會提高一些性能。
          Int32?v?=?5;
          //?需三次boxing
          Console.WriteLine("{0},?{1},?{2}",?v,?v,?v);

          //?只需一次boxing
          Object?o?=?v;
          Console.WriteLine(
          "{0},?{1},?{2}",?o,?o,?o);

          接下來書上舉了個很搞的例子說明boxing和unboxing的各種情況,其實也很容易理解。

          評論

          # re: C# 學習筆記 (1)  回復  更多評論   

          2008-04-02 23:40 by ha
          有時候覺得語言提供太多語法未必簡化了開發(fā)... 反而增加了復雜度

          # re: C# 學習筆記 (1)  回復  更多評論   

          2008-04-02 23:46 by ZelluX
          @ha
          C#語法不至于“太多”啊,粗看一下,delegate generics都是很好用的東西,3.0加入functional programming的元素應該會想當強大。

          # re: C# 學習筆記 (1)  回復  更多評論   

          2008-04-03 00:23 by BeanSoft
          有開源的啊 MONO.... Linux 下面可用,不過沒玩過。

          # re: C# 學習筆記 (1)  回復  更多評論   

          2008-04-03 00:24 by ZelluX
          @BeanSoft
          我用過。用起來也不錯。但是不算官方實現(xiàn)吧。

          # re: C# 學習筆記 (1)  回復  更多評論   

          2008-04-03 00:57 by robertlyc
          扯 自動裝箱拆箱也能扯半天
          還敢說Java呆

          # re: C# 學習筆記 (1)  回復  更多評論   

          2008-04-03 08:26 by Matthew Chen
          對于9,值類型是放在棧上,不過嚴格上講,值類型其實是可復制的結構體,boxing就是在堆上分配類空間,將其中一部分用結構體賦值(即復制)得到,所以看有些書上說值類型只存在棧上,其實任何類類型都可能存在對值類型的引用,而棧空間并非在類的生命周期中都可用,所以值類型的數(shù)據(jù)其實是可能保存在棧上的。

          # re: C# 學習筆記 (1)  回復  更多評論   

          2008-04-03 09:06 by TiGERTiAN
          開放了源代碼,只不過不能修改,編譯再發(fā)布而已。。

          # re: C# 學習筆記 (1)  回復  更多評論   

          2008-04-03 09:15 by ZelluX
          @robertlyc
          好吧,各么說的更明確些,援引Pixadel話,
          Fine, Java MIGHT be a good example of what a programming language should be like. But Java applications are good examples of what applications SHOULDN'T be like.

          # re: C# 學習筆記 (1)  回復  更多評論   

          2008-04-03 09:17 by ZelluX
          @Matthew Chen
          恩,我也剛想到其實在創(chuàng)建容器的時候只要復制一下值就行了,寫的時候只考慮到在容器里保留指針的實現(xiàn)方法了。

          # re: C# 學習筆記 (1)  回復  更多評論   

          2008-04-03 09:17 by ZelluX
          @TiGERTiAN
          好吧 >,<

          # re: C# 學習筆記 (1)  回復  更多評論   

          2008-04-03 11:53 by ZelluX
          @zht
          這英語。。。
          Java程序的冗余代碼多是個事實吧,有什么好爭的。
          語言表達能力的欠缺,比如寫個swap都得封裝。
          不過據(jù)說以后版本會引入closure和lambda,期待一下。

          # re: C# 學習筆記 (1)  回復  更多評論   

          2008-04-03 14:51 by ZelluX
          @zht
          "That's a direct quote from the Spring 2005 report."
          比較早的新聞了。而且具體評價方法也沒給出。
          再看看后面的評論
          "sounds good, but this just doesn't fit with my experience as a desktop end-user - where are all the swing apps? I'm seeing SWT based creations, eclipse rcp based creations but no swing "
          "Congratulations, but upon reflection I don't think I use a single Swing app on a daily basis. I use Eclipse, Firefox, Thunderbird, Gmail (AJAX), TextPad, OpenOffice, Palm, VNC. I used to use IntelliJ, but switched companies and we are Eclipse-based. What do other developers use? david www.testdriven.com "

          退一步講
          即使Swing真的占支配地位了,又能說明Java這個語言本身的什么呢?
          只能說這個框架做得越來越好了,主要的原因還是市場的推動。
          否則為什么Delphi這樣優(yōu)秀的語言會逐漸沒落呢?
          新生的Erlang又為什么沒有引起足夠的重視呢?

          而且我只用了“呆”這個形容詞。說的好聽點就是“中規(guī)中矩,按部就班”。這對一門工業(yè)語言來說不一定是壞事啊,不一定好的語言要像Ruby一樣,不同水平的人寫出來的代碼高下立判。只是我不喜歡這種有點八股文風格的語言罷了。

          # re: C# 學習筆記 (1)  回復  更多評論   

          2008-04-03 16:32 by BeanSoft
          呵呵 是呀 導彈和蚊子拍都有不同的使用場地。脫離上下文討論語言的好壞,是沒有意義的。Java就是那種幾乎什么都能來一手的語言。

          # re: C# 學習筆記 (1)  回復  更多評論   

          2008-04-04 18:59 by 孤帆1
          =====================================
          3. 方法調(diào)用和x86上匯編語言調(diào)用機制很類似。先是參數(shù)入棧,接著返回地址入棧,返回的時候也差不多。不知道x64等寄存器較多的架構上會不會使用寄存器傳參呢,呵呵。
          =====================================
          呵呵現(xiàn)在還能知道這個東西的人好像人不是很多了.

          正好我近期正在學習j2me,在學校時學過java的課程,不過那時我已經(jīng)使用了C#.
          語言沒有太多好爭議的,C#出現(xiàn)的時機比java遲,不得不承認有很多新的亮點.
          很多設計更加的人性化、簡潔.
          主站蜘蛛池模板: 邳州市| 通城县| 宝鸡市| 榆中县| 涞源县| 桦川县| 玉山县| 峨眉山市| 虹口区| 定州市| 玛纳斯县| 乌鲁木齐市| 南充市| 宁津县| 金平| 云阳县| 花垣县| 吉林省| 华宁县| 根河市| 永寿县| 江源县| 临颍县| 东乌| 汪清县| 宝鸡市| 互助| 佳木斯市| 莱西市| 辉县市| 柘荣县| 枝江市| 九江县| 神农架林区| 贵定县| 河南省| 许昌县| 明溪县| 马公市| 蕉岭县| 交城县|