CLR via C#,2

這兩天陸陸續續的看了點小知識點。明白了CLR和FCL的對應關係,as要比is性能好多了,as是直接返回轉換成功的類型或者是null,is只是返回true或false,在新生成一個對象時,內存堆上同時額外要生成類型對象指針和同步塊索引,執行的時候生成JIT編譯的代碼。String和string沒有區別。由於C#的string(一個關鍵字)直接映射到System.String(一個FCL類型),所以兩者沒有區別,都可以使用。在C#中,int始終映射到System.Int32,所以不管在什麼操作系統上運行,代表的都是32位整數。對於數值類型,“不安全”意味着在轉換之後,有可能丟失精度或者數量級,就要求進行顯式轉型。C#是進行截斷處理而不是向上取整。

Byte b = 100;
     b = checked((Byte)(b + 155));//會進行檢測是否溢出Byte,運行會報錯
     Console.WriteLine(b);
     b = (Byte)checked(b + 111);//不會進行檢測是否溢出,運行不會報錯,最後只是生成隨機數
     Console.WriteLine(b);
checked {
      b += 200;//代碼塊進行溢出檢查,會報溢出錯誤
      }
重要提示:由於checked操作符和checked語句唯一的作用就是決定生成哪一個版本的加、減、乘和數據轉換IL指令,所以在一個checked操作符或者語句中調用一個方法,不會對該方法造成任何影響。
System.Numerics.BigInteger類型也在內部使用一個UInt32數組來表示一個任意大的整數,它的值沒有上限和下限,和Decimal沒有IL指令。所以checked和unchecked操作符、語句以及編譯器開關都失去了效用。
在文檔中查看一個類型時,任何稱爲“類”的類型都是引用類型。例如,System.Exception類、System.IO.FileStream類以及System.Random類都是引用類型。相反,文檔將所有值類型都稱爲結構或枚舉。例如,System.Int32結構、System.Boolean結構、System.Decimal結構、System.TimeSpan結構、System.DayOfWeek枚舉、System.IO.FileAttributes枚舉以及System.Drawing.FontStyle枚舉都是值類型。
引用類型向另一個類進行復制時,只是複製了內存指針,兩個變量的棧保存的是同一個引用地址。值類型進行復制時,在棧上另外分配空間並複製成員,當改變其中一個值時,另一個值不會變。
裝箱是要把值類型從棧中複製到託管堆中,然後返回一個引用地址。拆箱是獲取已裝箱的對象的字段地址。拆箱不要求在內存中複製任何字節。進行拆箱賦值時,要先拆箱爲裝箱之前的類型,然後進行類型轉換。Int16 x = 16;
            object o = x;//裝箱,o引用已裝箱的x的實例
            Int32 y = (Int32)(Int16)o;//拆箱後要進行正確的類型轉換
如果想檢查同一性(看兩個引用是否指向同一個對象),那麼務必調用ReferenceEquals,而不應使用C#的==操作符(除非先把兩個操作數都轉型爲Object),因爲其中某個操作數的類型可能重載了==操作符,爲其賦予有別於“同一性”的其他語義。
以後還是自己寫在word文檔裏吧,這些瑣碎的東西沒有經過很細緻的思考的。不好不好。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章