转换
C#里,互相兼容的类型实例间可以相互转换。
转换总是从现有的值创建出来一个新的值
隐式VS显式
隐式转换时自动发生的
条件
编译器可以保证转换会成功
信息不会有损失
例
int a = 123;
long y = a;
显式转换需要手动进行
条件
编译器不能保证转换会成功
信息可能会有损失
例
short z = (short)y;
如果编译器可以断定转换肯定会失败,那么两种转换都会被禁止。
C#类型分类
值类型VS引用类型(深入理解值类型和引用类型)
- 值类型(值类型的DEMO)
- 包含所有的内置类型(数值、字符、bool)和自定义的struct和enum
- 值类型变量/常量的内容就是一个值。
- 使用struct关键字可以创建自定义的值类型
- 总结
- 值类型的赋值
- 值类型实例的赋值动作总是复制了该实例。
- 值类型的赋值
- 包含所有的内置类型(数值、字符、bool)和自定义的struct和enum
- 引用类型(比值类型复杂)
- 引用类型的变量/常量的内容就是到一个含有值的对象的引用
- 包含所有的class、数组、delegate、interface类型。包括字符串
- 一个对象
- 到该对象的引用
- 它们的根本区别在于处理内存的方式。
Null
Null是一个literal(常量)。
可以把null赋值给引用,表示该引用不指向任何一个对象。
null.Propery会掏出NullReferenceException异常
普通的值类型不可以为Null
存储的开销-值类型
值类型的实例所占的内存=它的字段需要内存的总和。
CLR会把类型内的字段大小设置为该字段实际大小的整倍数。
存储的开销-引用类型
需要为引用和对象单独分配内存
对象所占内存=其字段所占内存总和+额外的管理开销(最少8字节)
每个对象的引用还需要额外的4或8个字节,(根据平台是32位还是64位)
内置类型的分类
值类型
数值型
Signed integer(sbyte,short,int,long)
Unsigned integer(byte,ushort,uint,ulong)
实数(float,double,decimal)
逻辑(bool)
字符(char)
引用类型
字符串(string)
对象(object)
内置类型
- System命名空间
- 除了decimal之外的内置类型叫做原始类型
- 通过指令,在编译的代码里直接被支持,通常被翻译成底层处理器直接的支持
System.IntPtr和System.UIntPtr也是原始类型
int类型占32bit内存