第2章 数据类型
C#有几种类型非常简单,是其他所有类型的基础,它们称为预处理类型或==基元类型==。
2.1 基本数值类型
2.1.1 整数类型
C#为基元数据类型的完整名称提供了短名称或称为缩写。其实从编译器的角度来看,两种名称完全一样,最终都生成相同的代码。检查最终生成的CIL代码,根本看不出代码具体使用的名称。
C#支持完整BCL名称和关键字,通常使用关键字。
设计规范
•要在指定数据类型时使用C#关键字而不是BCL名称。
•要一致不要变来变去。
语言对比:C++——short数据类型
C/C++的short数据类型是short int的缩写。而C#的short是一种实际存在的数据类型。
2.1.2 浮点类型
2.1.3 decimal类型
高级主题:解析浮点类型和decimal类型
2.1.4 字面值
字面值表示源代码中的固定值。例如,假定希望用System.Console.WriteLine()输出整数值42和double值1.618034(黄金分割比例)。
System.Console.WriteLine(42);
System.Console.WriteLine(1.618034);
初学者主题:硬编码值得时候要慎重
直接把值放在源代码中称为硬编码,因为以后若是更改了值,就必须重写编译代码。
默认情况下,输入带小数点得面值,编译器自动把它解释为double类型。
设计规范
•要使用带大写得字面值后缀(例如1.618033988749895M)
•解决可读性问题可以用_分开大额数字。
初学者主题:十六进制计数法
高级主题:将数字格式化十六进制
高级主题:round-trip格式化
2.2更多基本类型
2.2.1 布尔类型 bool
理论上一个二进制位足以容纳一个布尔类型的值,但bool实际大小是一个字节。
2.2.2 字符类型 char
表示16位字符
初学者主题:Unicode标准
这是一个国际化标准,用来表示大多数语言中的字符。它便于计算机系统构建本地化应用程序。
高级主题:16位不足以表示所有UNicode字符。
有的字符不能直接插入源代码,需要进行特殊处理。输入反斜杠\为前缀,再跟随一个特殊字符代码,称为转义序列。
2.2.3 字符串
string是一种“不可变”的类型
高级主题:理解字符串插值内部的工作原理
字符串插值是调用了string.Format()方法的语法糖。
语法糖:在不改变其功能的情况下,通过改变代码的写法,让代码更具有可读性。
高级主题:using和 ==using static==指令
using static 每次使用类的成员,不需要该类作为前缀,直接使用其中的方法名即可。 只支持静态方法和属性,不支持实例成员。
高级主题:C#属性
C#语法允许像访问成员变量(在C#中称为字段)那样访问属性。
判断字符串长度可以使用string的Length成员,该成员是只读属性不能设置,调用时也不需要任何参数。
字符串长度不能直接设置,它是根据字符串中的字符数计算得到的,此外,字符串长度不能更改,因为字符串 不可变。
不能在同一个内存位置更改字符串,只能在其他内存位置新建字符串,旧的字符串不会被修改,如果没人引用它,会被垃圾回收。
2.3 null和void
null值表示变量不应用任何有效对象。 void表示无类型,或者没有任何值。
2.3.1 null
null可直接赋给字符串变量,表明表明为“空”,不指向任何位置。只能将null赋给引用类型、指针类型和可空值类型。
将null赋给引用类型的变量和根本不赋值是不一样的概念。赋值了null的变量已设置,而未赋值的变量未设置。使用未赋值的变量会造成编译时错误。
2.3.2 void
又是C#语法要求指定数据类型但是不传递任何数据。假定方法无返回值,C#就允许数据类型位置放一个void关键字。void本质不是数据类型,它只是指出没有数据类型这一事实。
2.4 数据类型转换
类型之间的转换至关重要,造成转换的最常见操作就是转型或强制类型转换。
有可能造成数据丢失或者引发异常的任何转换都需要执行 显示转换。相反,不会丢失数据,而且不会引发异常的任何转换都可以进行 隐式转型。
2.4.1 显示转型
语言对比:数值转换为布尔值
C#不存在从数值类型到布尔类型的有效转型,为了避免发生歧义。
2.4.2 隐式转型
2.4.3 不使用转型操作符的类型转换
Parse()方法,允许将字符串类型转换为相应的数值类型。
高级主题:TryParse()
该方法和Parse()相似,只是转换失败不会引发异常,而是返回false。