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

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

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

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

    C# 學習筆記 (1)

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

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

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

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

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

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

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

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

    8. boxing和unboxing。
    boxing:托管堆中分配內存,復制值類型,然后返回對象地址。
    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
    有時候覺得語言提供太多語法未必簡化了開發... 反而增加了復雜度

    # 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
    我用過。用起來也不錯。但是不算官方實現吧。

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

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

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

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

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

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

    # 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
    恩,我也剛想到其實在創建容器的時候只要復制一下值就行了,寫的時候只考慮到在容器里保留指針的實現方法了。

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

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

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

    2008-04-03 11:53 by ZelluX
    @zht
    這英語。。。
    Java程序的冗余代碼多是個事實吧,有什么好爭的。
    語言表達能力的欠缺,比如寫個swap都得封裝。
    不過據說以后版本會引入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這樣優秀的語言會逐漸沒落呢?
    新生的Erlang又為什么沒有引起足夠的重視呢?

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

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

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

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

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

    正好我近期正在學習j2me,在學校時學過java的課程,不過那時我已經使用了C#.
    語言沒有太多好爭議的,C#出現的時機比java遲,不得不承認有很多新的亮點.
    很多設計更加的人性化、簡潔.
    主站蜘蛛池模板: 亚洲中文字幕无码久久综合网| 四虎成人免费大片在线| 亚洲欧洲一区二区三区| 亚洲免费在线视频| 久久精品国产亚洲av麻| 久久狠狠躁免费观看| 亚洲日本精品一区二区| 最近高清中文字幕免费| 亚洲一区二区三区播放在线 | 999任你躁在线精品免费不卡| 亚洲日韩中文字幕在线播放| 中文字幕a∨在线乱码免费看| 亚洲成a人片在线观看日本| 精品国产免费一区二区三区香蕉| 亚洲国语精品自产拍在线观看| 97精品免费视频| 色天使亚洲综合在线观看| 久久国产乱子精品免费女| 亚洲AV无码1区2区久久| 久久精品成人免费观看97| 亚洲精品午夜国产VA久久成人| 免费国产叼嘿视频大全网站| 91亚洲精品自在在线观看| 好爽…又高潮了免费毛片| 青青久久精品国产免费看| 亚洲成在人线av| 久久午夜免费视频| 黄页网址在线免费观看| 亚洲AV无码久久精品蜜桃| 色妞WWW精品免费视频| 一级毛片a女人刺激视频免费| 日本免费一区二区三区最新vr| 牛牛在线精品观看免费正| 亚洲午夜久久久精品影院| 99视频在线精品免费观看6| 国产精品免费在线播放| 亚洲国产精品日韩在线观看 | 成年性羞羞视频免费观看无限| 一区二区三区亚洲| 国产精品无码免费视频二三区| 亚洲国产综合精品中文第一|