熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

在asp.net中KindEditor編輯器的使用總結

2022-06-13   來源: .NET編程 

  CLR類型系統有兩種主要類型—Reference Type和ValueType前者是在托管堆中被分配內存並接受管理後者則有兩種形態裝箱與未裝箱對於裝箱形態的值對象是在托管堆中未裝箱形態的值對象是在棧上分配

  CLR堆上對象和棧上對象的差異

  每一個堆上對象都有兩個額外的字段一個是類型引用表的指針用於實現多態類似於C++的多態機制另一個字段是SyncBlockIndex用於實現CLR線程同步機制棧上對象則無這兩個字段

  裝箱的過程

  裝箱

  在堆上開辟內存包括個額外字段+值對象大小

  將值對象復制過去

  返回新分配對象的地址

  拆箱的過程

  如果為null跑出NullReferenceException

  如果引用指向的不是一個期望對象的已裝箱對象跑出InvalidCastException

  得到堆上引用對象中未裝箱對象的指針

  兩者是反過程嗎

  對比上述裝箱和拆箱的過程可以看出兩者並非是互為反操作拆箱過程本身並不涉及內存操作不會像裝箱那樣拷貝數據但是拆箱之後通常也還是要將值從堆上進行拷貝的棧上的

  性能差異

  了解了裝箱和拆箱的操作我們可以清楚的明白裝箱操作會導致數據在堆和棧上進行拷貝頻繁的裝箱操作會性能損失而相比而言拆箱過程對性能損耗還是比較小的

  發現代碼中的裝箱和拆箱操作

  )

  Int a = ;

  object b = a;//(A)

  a = (int)b;//(B)

  (A)發生一次裝箱操作

  (B)發生一次拆箱操作

  )

  Point p = new Point();

  ConsoleWriteLine(pClone());//(A)

  var p = p as ICloneable;//(B)

  var p = (Point)p;//(C)

  (A)Point重載了Clone()方法所以這一步無需借助多態p本身不會被裝箱但是要注意Clone返回的是一個object所以這一步會出現一個裝箱操作

  (B)會產生裝箱操作

  (C)這一步會出現拆箱操作並發生內存拷貝(從托管堆上拷貝到棧上)

  使用ILDASM查看IL代碼

  vs自帶的tools裡提供了一個ILDASM的工具能夠查看程序集的IL代碼

  在vs的命令行環境下(command prompt)執行ILDASM  /adv/adv參數能開啟一些高級操作打開一個未混效過的程序集我們就能查看到其IL代碼相信您能從中發現更多有趣的東西

  image      image


From:http://tw.wingwit.com/Article/program/net/201311/11297.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.