2.3 变量
在程序的运行中,计算中临时存储的数据都必须用到变量,变量的值也会放置在内存当中,由计算机运算后再保存到变量中。变量是内存中可以读写的内存单元,变量的数据类型决定存储数据的内存单元所占用空间的大小及存储在其中的数据格式。
2.3.1 变量分类
1.值类型变量
这种类型的变量,直接通过其值使用,不需要对它进行引用。所有的值类型均隐式地派生自System.ValueType,并且值类型不能派生出新的类。值的类型不能为null,但是可空类型允许将null值赋给值类型。下列代码是声明并初始化一个值类型的变量。
2.引用类型变量
引用类型的变量又称为对象,可存储实际数据的引用。常见的引用类型有class、inter-face、delegate、object和string。多个引用变量可以附加于一个对象,而且某些引用可以不附加于任何对象,如果声明了一个引用类型的变量却不给它赋给任何对象,那么它的默认值就是null。相比之下,值类型的值不能为null。
2.3.2 变量命名规则和命名习惯
声明变量并不是随意声明的,变量的声明有自己的规则。在C#中,应用程序包含许多关键字,包括int等是不能够声明为变量名的,如int int是不允许的。当使用关键字做变量名时,编译器会混淆该变量是变量还是关键字,从而编译出错。所以在进行变量的声明和定义时,需要注意变量名称是否与现有的关键字重名,表2-2列出了C#中的关键字。
命名规则就是给变量取名的一种规则,一般来说,命名规则就是为了让开发人员给变量或者命名空间取个好名,不仅要好记,还要说明一些特性。在C#里面,一些常用的命名习惯如下。
■Pascal大小写形式:所有单词的第一个字母大写,其他字母小写。
■Camel大小写形式:除了第一个单词,所有单词的第一个字母大写,其他字母小写。
表2-2 C#关键字列表
(续)
2.3.3 变量声明、初始化
要声明一个变量就需要为这个变量找到一个数据类型,在C#中,数据类型由.NET Framework和C#语言来决定,表2-3列举了一些预定义的数据类型。声明变量的语法非常简单,即在数据类型之后编写变量名,如一个人的年龄(age)和一辆车的颜色(color),声明代码如下:
变量在声明后还需要初始化,初始化代码如下:
当然,声明和初始化变量可以合并为一个步骤简化编程开发,示例代码如下:
当运行了以上代码后会提示错误信息:不能隐式地将double类型转换为float类型;请使用“F”后缀创建此类型。
从错误中可以看出,将变量后缀增加一个“F”即可解决此问题,代码如下:
这是因为若无其他指定,C#编译器将默认所有带小数点的数字都是double类型。如果要声明成其他类型,可以通过后缀来指定数据类型,表2-3列出可用的后缀。
表2-3 可用的后缀表
2.3.4 变量类型转换
在应用程序开发当中,很多的情况都需要对数据类型进行转换,以保证程序的正常运行。类型转换是数据类型和数据类型之间的转换,在.NET中,存在着大量的类型转换,常见的类型转换代码如下:
在上述代码中,i是整型变量,而WriteLine方法的参数是object类型,但是WriteLine方法依旧能够正确输出,是因为系统将i的类型在输出的时候转换成了字符型。在.NET框架中,有隐式转换和显式转换,隐式转换是一种由CLR自动执行的类型转换,如上述代码中的就是一种隐式的转换(开发人员不明确指定的转换)。该转换由CLR自动的将int类型转换成了string型。在.NET中,CLR支持许多数据类型的隐式转换,CLR支持的类型转换列表见表2-4。
表2-4 CLR支持的转换列表
显式转换是一种明确要求编译器执行的类型转换。在程序开发过程中,虽然很多地方能够使用隐式转换,但是隐式转换有可能存在风险,显式转换能够通过程序捕捉进行错误提示。虽然隐式也会提示错误,但是显式转换能够让开发人员更加清楚地了解代码中存在的风险并自定义错误提示以保证任何风险都能够及早避免,示例代码如下:
上述代码说明了显式转换的基本语法格式。
注意:显式的转换可能导致数据的部分丢失,如3.1415转换为整型的时候会变成3。