转换

C#里,互相兼容的类型实例间可以相互转换。
转换总是从现有的值创建出来一个新的值
隐式VS显式
隐式转换时自动发生的
条件
编译器可以保证转换会成功
信息不会有损失

int a = 123;
long y = a;
显式转换需要手动进行
条件
编译器不能保证转换会成功
信息可能会有损失

short z = (short)y;
如果编译器可以断定转换肯定会失败,那么两种转换都会被禁止。

C#类型分类

值类型VS引用类型(深入理解值类型和引用类型

  • 值类型(值类型的DEMO
    • 包含所有的内置类型(数值、字符、bool)和自定义的struct和enum
      • 值类型变量/常量的内容就是一个值。
      • 使用struct关键字可以创建自定义的值类型
      • 总结
        • 值类型的赋值
          • 值类型实例的赋值动作总是复制了该实例。
  • 引用类型(比值类型复杂)
    • 引用类型的变量/常量的内容就是到一个含有值的对象的引用
    • 包含所有的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内存