这两天陆陆续续的看了点小知识点。明白了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文档里吧,这些琐碎的东西没有经过很细致的思考的。不好不好。