C#变量

命名约定

命名约定示例适用场合
驼峰样式cost、orderDetail、dateOfBirth局部变量、私有字段
标题样式String、Int32、Cost、DateOfBirth、Run类型、非私有字段以及方法

存储文本——理解逐字字符串
在字符串变量中存储文本时,可以包括转义序列,转义序列使用反斜杠表示特殊字符,如制表符和新行,如下所示:

string fullNameWithTabSeparator = "Bob\tSmith";

但是,如果在Windows上要将路径存储到文件中,并且路径中有文件夹的名称以t开头,如下所示:

string fileFath = "C:\televisions\sony\bravia.txt";

那么编译器将把\t转换成制表符,这显然是错误的!
逐字字符串必须加上@符号作为前缀,如下所示:

string fileFath = @"C:\televisions\sony\bravia.txt";

字面字符串:用双引号括起来的一些字符。它们可以使用转义字符\t作为制表符。要表示反斜杠需要是使用\\。
逐字字符串:以@为前缀的字面字符串,以禁用转义字符,因此反斜杠就是反斜杠。它还允许字符串值跨越多行,因为空白字符被视为空白,而不是编译器的指令。
内插字符串:以$为前缀的字面字符串,以支持嵌入的格式化变量,详见本章后面的内容。

存储整数
计算机把所有东西都存储为位。位的值不是0就是1,即二进制。

二进制和十六进制计数法
二进制计数法以2为基数,只使用0和1,数字字面值的开头是0b。
十六进制计数法以16为基数,使用的是0~9和A~F,数字字面值的开头是0x。

使用数字分隔符提高可读性
C# 7.0级更高版本中的两处改进是使用下划线_作为数字分隔符以及支持二进制字面值。可以在数字字面值(包括十进制、二进制和十六进制表示法)中插入下划线,以提高可读性。例如,可以将十进制数字1000000写成1_000_000。

存储任何类型的对象
有一种名为object的特殊类型,这种类型可以存储任何数据,但这种灵活性是以混乱的代码和可能较差的性能为代价的。由于这两个原因,应该尽可能避免使用object类型。

动态存储类型
还有一种特殊类型名为dynamic,可用于存储任何类型的数据,并且灵活性相比object类型更强,代价是性能下降了。dynamic关键字是在C# 4.0中引入的。但是,与object不同的是,存储在dynamic变量中的值可以在没有显式进行强制转换的情况下调用成员。dynamic类型存在的限制是,代码编辑器不能显示智能感知来帮助编写代码。这是因为编译器在构建期间不能检查类型是什么。相反,CLR会在运行时检查成员;如果缺少成员,则抛出异常。

推断局部变量的类型
可以使用var关键字来声明局部变量。编译器将从赋值操作符=之后赋予的值推断类型。
尽管使用var很方便,但一些开发人员避免使用它,以使代码阅读者更容易理解所使用的类型。

使用面向类型的new实例化对象
在C# 9.0中,微软引入了另一种用于实例化对象的语法,称为面向类型的new。当实例化对象时,可以先指定类型,再使用new,而不用重复写出类型。
除非必须使用C# 9前的编译器,否则尽量使用面向类型的new来实例化对象。
C#中实例化对象是指用new关键字创建类的具体对象,这样才能调用类中的非静态方法。例如,如果你有一个名为Person的类,你可以这样实例化一个名为person的对象:

Person person = new Person();

实例化对象的过程就是给对象分配内存空间,并调用类的构造函数。

获取和设置类型的默认值
除了string外,大多数基本类型都是值类型,这意味着它们必须有值。可以通过使用default()操作符并将类型作为参数传递来确定类型的默认值。可以使用default关键字指定类型的默认值。
string类型是引用类型。这意味着string变量包含值的内存地址而不是值本身。引用类型的变量可以有空值;空值是字面量,表示变量尚未引用任何东西。空值是所有引用类型的默认值。

在数组中存储多个值
当需要存储同一类型的多个值时,可以声明数组。例如,当需要在string数组中存储四个名称时,就可以这样做。
下面的代码可用来为存储四个字符串值的数组分配内存。首先再索引位置0~3存储字符串值(数组是从0开始计数的,因此最后一项比数组长度小1)。

string[] names;
names = new string[4];
names[0] = "Kate";
names[1] = "Jack";
names[2] = "Rebecca";
names[3] = "Tom";

还有另一种方法是使用数组初始化器语法,如下面的代码所示:

string[] names = new[] {"Kate""Jack""Rebecca""Tom"};

使用new[]语法为数组分配内存时,花括号中至少要有一个项,以便编译器推断出数据类型。

不要假设所有数组的计数都是从零开始的。.NET中最常见的数组类型是szArray,这是一种一维的零索引数组,它们使用正常的[]语法。但是.NET也有mdArray,一个多维数组,它们不必有一个为零的下界。这很少使用,但需要知道它的存在。

数组对于临时存储多个项很有用,但是再动态添加和删除项时,集合是更灵活的选择。后面会学到。