目录
第02部分 值类型
- 值类型:默认情况下,在分配中,通过将实参传递给方法并返回方法结果来复制变量值。
- 值类型包括结构类型(用于封装数据和相关功能)和枚举类型(有一组命名常数定义,表示一个选择或选择组合),可为 null 值类型 T?(表示其基础值类型 T 的所有值和额外的 null 值)。
- 内置值类型(简单类型,也是结构类型的一种),包括整型数值类型,浮点型数值类型,bool,字符。
2.1 整型数值类型
- 表示整数,支持算数,位逻辑运算,比较和相等运算。
- 特征:
- sbyte,byte,short,ushort,int,uint,long,ulong。
- byte 占 1 个字节,short 占 2 个字节,int 占 4 个字节,long 占 8 个字节。分为带符号与不带符号。
- 整数文本
- 前缀:十进制没有前缀,十六进制有 0x 或 0X 前缀,二进制有 0b 或 0B 前缀。
- 后缀:uint 和 ulong 文本以 U 或 u 为后缀,long 或 ulong 以 L 或 l 为后缀。
- ul,Ul,uL,UL,lu,Lu,lU,LU 表示为 ulong
2.2 浮点数值类型
- 表示实数。
- 特征:
- float 占 4 个字节,7~8 位精度。
- double 占 8 个字节,15~17 位精度。
- decimal 占 16 个字节,28~29 位精度。
- 整型与浮点类型区别
- 他们的默认值都为 0,并且都有最大最小值的属性,浮点值提供了 NaN 与 Infinity 无穷大值。
- decimal 特征
- 高精度的特性适合用于财务和货币计算。但是 decimal 不可以和 float 与 double 混合使用,之间需要显式转换,不存在隐式转换。
- 真实文本
- d 或 D 表示 double 的后缀。
- f 或 F 是 float 的后缀。
- m 或 M 是 decimal 的后缀。
2.3 内置数值转换
-
隐式数值转换
- 低精度到高精度可以通过隐式方式直接赋值给高精度类型。
- 整型转换到浮点型可能会丢失精准度,但不会丢失一个数量级。
- 任何整型都可以隐式转换成浮点型。
- 整型内部之间转换要求其值范围要在高精度值类型范围内可以隐式转换。
-
显式数值转换
- 转换过程可能会丢失数据或者引发异常,表现位 OverflowException。
- 在转换过程中,结果取决于溢出检查上下文。
- decimal 转换成整型时,此值会舍去 0 到最接近的整数值,若超出整型的范围位引发溢出异常。
- double 到 float 时,太小会变成 0,太大会变成无穷。double,float 到 decimal 时采用四舍五入,数太小时无法表示为 decimal,NaN 与无穷不可以转换为 decimal。
2.4 布尔类型
- 特征
- 在进行有关布尔运算时,要使用布尔逻辑运算符,bool 是比较和相等运算的结果类型。其表达式可以是 if,do,while,和 for 语句以及三目运算符中的控制条件表达式。
- bool 默认值是 false,占用字节 1。
2.5 字符类型
-
特征
- char 默认值为空格,类型支持比较,相等,增量和减量运算,对于 char 操作数,算数和逻辑位运算符是字符代码之间的运算,结果是 int。
- 字符串类型将文本表示为 char 值的序列。
-
文本
- Unicode 转义序列或十六进制转义序列用来表示一个字符。
-
转换
- char 可以隐式转换 ushort 以上的整型,浮点型,可以显式转换其他类型。
- 无法将其他类型隐式转换成 char,但是任何数值类型都可以显式转换成 char。
2.6 枚举类型
- 由其基础整型数值类型的一组命名常量定义的值类型
- 关联常数项默认从 0 开始,也可以显式指定整数。
- 不能在枚举中定义方法。
- (Enum)int 生成其成员,可以用(int)Enum.成员来获取成员关联的常数。
- 一般会选择一组互斥的值或选项组合来表示选项。
2.7 结构类型
- 结构类型是一种可封装数据和相关功能的值类型,使用 struct 关键字定义。结构体使得单一变量可以存储各种数据类型的相关数据。
- 特征
- 结构体中的成员在结构体中不能初始化,可包含多种变量类型和数组。
- 结构体可以封装方法,这个方法只用在该结构体下的成员之间的变换,转换等。
- 结构体的存储方式在此标识符内是连续存储的,应用 C 语言内存对齐原理,实际各个成员占用的空间大小与自身大小出现不一致的现象,编译器在具体的实现中采用空白补齐使得各成员之占用的空间大小保持一致。
- 结构体是自定义数据类型,不占用内存,在创建实例的时候会像一般值类型一样开辟空间。
- 整体赋值
- 结构体给成员赋值的时候可以采用数组整体赋值的方式初始化。
- 结构体也可以进行成员逐一赋值。
- 设计限制
- 具有类相同的功能,但是不能声明无参构造函数。每个结构体自带一个隐式无参构造。
- 声明实例字段和属性时不能进行初始化,但是静态字段和属性,常量是可以初始化的。
- 结构类型的构造函数必须初始化该类型的所有实例字段。
- 结构体不可以被继承,但是可以继承接口。
- 结构体中不存在终结器的概念,也不可以声明终结器。
- 按引用传递结构类型变量
- 将结构类型变量作为参数传递给方法或从方法返回结构体类型值时将复制整个结构体成员,这可能会影响高性能方案中涉及大型结构类型的代码的性能。
- 可以安宅引用传递结构类型变量,可以避免复制操作,使用 ref,in 或 out 方法参数修饰符,指示必须按引用传递参数。使用 ref 返回值按引用返回方法结果。
- 转换
- 对于任何结构类型(ref struct 除外),都存在与 System.ValueType 和 System.Object 之间的装箱和拆箱相互转换。也存在结构类型和它所实现的任何接口之间的装箱和取消装箱转换。
2.8 元组类型
- 使用简洁的语法,用于将多个数据元素分组称为一个转型数据结构。
- 在访问元组内部成员的时候需要点出的方式访问。
- 元组类型支持==与!=运算,元组的元素时公共字段,所以元组具有可变值类型特征。
- 可以使用 var value= (item1,item2,item3...)声明元组。元组常用于作为方法的返回值,可以实现方法能够由多个返回值。
- 可以使用匿名变量析构出元组中的元素。
- 元组的相等会按照从左往右的顺序依次比较成员基本值。
2.9 可为空的值类型
- 表示为 T?在 T 基础上增加一个 null 值。
- 从 T?转换成 T 可以用 Null 和合并运算符。T? ?? T;T 可以隐式转换成 T?
- 除了 bool?,T?在运算时有一个为 null 时值的结果就是 null。
- 任意的比较运算符,有 null 的情况下,返回值均为 false,但是 null==null 返回 true。