1.3 使用变量
前面我们已接触了最基本的C#程序,下面声明局部变量。变量声明后可以赋值,可将值替换成新值,并可在计算和输出等操作中使用。但变量一经声明,数据类型就不能改变。在代码清单1.10中,string max就是变量声明。
代码清单1.10 变量声明和赋值
初学者主题:局部变量
变量是存储位置的符号名称,程序以后可对该存储位置进行赋值和修改。局部意味着变量在方法或代码块(一对大括号{})内部声明,其作用域“局部”于当前代码块。所谓“声明变量”就是定义一个变量,你需要:
1.指定变量要包含的数据的类型;
2.为它分配标识符,即变量名。
1.3.1 数据类型
代码清单1.10声明的是string类型的变量。本章还使用了int和char。
·int是指C#的32位整型。
·char是字符类型,长度为16位,足以表示无代理项的Unicode字符[1]。
下一章将更详细地探讨这些以及其他常见数据类型。
初学者主题:什么是数据类型?
数据类型(或对象类型)是具有相似特征和行为的个体的分类。例如,animal(动物)就是一个类型,它对具有动物特征(多细胞、具有运动能力等)的所有个体(猴子、野猪和鸭嘴兽等)进行了分类。类似地,在编程语言中,类型是被赋予了相似特性的一些个体的定义。
1.3.2 变量的声明
代码清单1.10中的string max是变量声明,它声明名为max的string变量。还可在同一条语句中声明多个变量,办法是指定数据类型一次,然后用逗号分隔不同标识符,如代码清单1.11所示。
代码清单1.11 一条语句声明两个变量
由于声明多个变量的语句只允许提供一次数据类型,因此所有变量都具有相同类型。
C#变量名可用任何字母或下划线(_)开头,后跟任意数量的字母、数字或下划线。但根据约定,局部变量名采用camelCase命名(除了第一个单词外,其他每个单词的首字母大写),而且不包含下划线。
设计规范
·要为局部变量使用camelCase风格命名。
1.3.3 变量的赋值
局部变量声明后必须在读取前赋值。一个办法是使用=操作符,或者称为简单赋值操作符。操作符是一种特殊符号,标识了代码要执行的操作。代码清单1.12演示了如何利用赋值操作符指定miracleMax和valerie变量要指向的字符串值。
代码清单1.12 更改变量值
从中可以看出,既可在声明变量的同时赋值(比如变量miracleMax),也可在声明后用另一条语句赋值(比如变量valerie)。要赋的值必须放在赋值操作符右侧。
运行编译好的程序生成如输出1.3所示的结果。
输出1.3
本例列出了dotnet run命令,以后会省略,除非要附加额外参数来指定程序的运行方式。
C#要求局部变量在读取前“明确赋值”。此外,赋值作为一种操作会返回一个值。所以C#允许在同一语句中进行多个赋值操作,如代码清单1.13所示。
代码清单1.13 赋值会返回值,该值可用于再次赋值
1.3.4 变量的使用
赋值后就能用变量名引用值。因此,在System.Console.WriteLine(miracleMax)语句中使用变量miracleMax时,程序在控制台上显示:“Have fun storming the castle!”也就是miracleMax的值。更改miracleMax的值并执行相同的System.Console.WriteLine(miracleMax)语句,会显示miracleMax的新值,即It would take a miracle.。
高级主题:字符串不可变
所有string类型的数据,不管是不是字符串字面值[2],都是不可变的(不可修改)。例如,无法将字符串"Come As You Are."改成"Come As You Age."。也就是说,不能修改变量最初引用的数据,只能重新赋值,让它指向内存中的新位置。
[1] 某些语言的文字编码要用两个16位值表示。第一个代码值称为“高位代理项”(high surrogate),第二个称为“低位代理项”(low surrogate)。在代理项的帮助下,Unicode可以表示100多万个不同的字符。美国和欧洲地区很少使用代理项,东亚各国则很常用。——译者注
[2] 即literal,是指以文本形式嵌入的数据。literal有多种译法,没有一种占绝对优势。最典型的译法是“字面值”“文字常量”和“直接量”。本书采用“字面值”。——译者注