常量与变量详解
1、变量的基本概念
变量是指用来存储特定类型的数据,可以根据需要随时改变变量中所存储的数据值。变量具有名称、类型和值,因此使用变量之前必须先声明变量,即指定变量的类型和名称。
2、变量类型
变量类型根据其定义可以分为两种:一种是值类型,另一种是引用类型。这两种变量类型的区别在于数据的存储方式,值类型的本身是直接存储数据;而引用类型是存储实际数据的引用,程序通过引用查找到真正的数据。
1、值类型
值类型只要包括整数类型、浮点类型以及布尔类型等,值类型变量直接存储其数据值,它在内存栈中进行分配,因此效率很高,使用值类型主要是为了提高性能。
值类型具有以下特点:
•值类型变量都存储在堆栈中;
•访问值类型是,一般都是直接访问其实例;
•每个值类型变量都有自己的数据副本,因此对一个值类型变量的操作不会影响其他变量;
•复制值类型变量时,复制的是变量的值,而不是变量的地址;
•值类型变量不能为null,必须具有一个确定的值;
(1)整数类型
整数类型代表一种没有小数点的整数数值,在c#中内置的整数类型如下:
类型 |
说明 |
范围 |
sbyte |
8位有符号整数 |
-128~127 |
short |
16位有符号整数 |
-32768~32767 |
int |
32位有符号整数 |
-2147483648~2147483647 |
long |
64位有符号整数 |
-9223372036854775808~9223372036854775807 |
byte |
8位无符号整数 |
0~127 |
ushort |
16位无符号整数 |
0~65535 |
uint |
32位无符号整数 |
0~4294967295 |
ulong |
64位无符号整数 |
0~18446744073709551615 |
值得注意的是,在使用整数类型时,要确保数值大小,以免发生运算溢出的错误。
(2)浮点类型
浮点类型变量主要用于处理含有小数的数据,浮点类型主要包括float和double两种数值类型。
类型 |
说明 |
范围 |
float |
精确到7位数 |
|
double |
精确到15~16位数 |
|
如果不做任何设置,包含小数点的数值都被认为是double类型,如果要将数值以float类型来处理,通过强制使用f或f将其指定为float类型
如果是要将数值强制指定为double类型,需要使用d或d进行设置:
(3)布尔类型
布尔类型主要用来表示true/false,一个布尔类型的值只能是true或者false,不能将其指定为其他类型的值,布尔类型不能与其他类型进行转换。
2、引用类型
引用类型是构建c#引用程序的主要对象类型数据,在应用程序执行的过程中,对象类型以 new创建对象实例,并且存储在堆栈中。堆栈是一种由系统弹性配置的内存空间没没有特定的大小以及存活时间,因此可以被弹性地运用于对象的访问。
引用类型的特征:
1、必须在托管堆中为引用类型变量分配内存;
2、必须使用new关键字来创建引用类型变量;
3、在托管堆中分配每个对象都有与之相关的附加成员,这些成员必须被初始化;
4、引用类型变量是由垃圾回收机制来管理的;
5、多个引用类型边浪可以引用同一个对象,这种情况下,对一个变量操作会影响另一个变量所引用的同一个变量;
6、引用类型被赋值前的值都是null;
3、值类型与引用类型的区别
从概念上说,值类型是直接存储其值的,而引用类型则是存储对其值的引用,这两种类型存储在内存的不同地方。在c#中,再设计类型的时候就要决定类型实例的行为,如果系统不能理解应用类型和值类型的区别,将会给代码带来不必要的异常。
从内存上看,值类型是在栈中操作的,而引用类型则是在堆中分配内存单元。栈在编译时就分配好内存空间,在代码中有栈的明确定义;而堆是程序运行中动态分配的内存空间,可以根据程序的运行情况动态地分配内存的大小。因此,值类型总是在内存中占用一个预定义的字节数。而引用类型的变量则在栈中分配一个内存空间,这个内存空间包含对另一个内存位置的引用,这个位置是托管堆中的一个地址,即存放此变量实际值的地方。
4、枚举类型
枚举类型是一种独特的值类型,他生命一组具有相同性质的常量。就比如我们编写与日期相关的引用程序的时候,经常要使用到面、月、星期等日期数据,可以将这些数据组成多个不同名称的枚举类型。使用枚举类型可以增加程序的可读性和可维护性,同事,也可以避免类型的错误。
特别注意的是,在定义枚举类型时,如果不对其进行复制,默认情况下,第一个枚举数的值为0,后面每个枚举数的值一次递增1.
在c#中用关键字enum声明枚举,形式如下:
1 enum 枚举名 2 3 { 4 5 list1=value1, 6 7 list2=value2, 8 9 ... 10 11 listn=valuen 12 13 }
其中,大括号中的内容为枚举值列表,每个枚举对应一个枚举值名称,value1--valuen为整数数据类型,list1--listn则为枚举值的标识名称。
5、类型转换
类型转换就是将一种类型转换成另一种类型,具体可以分为隐式转换和显式转换两种方式:
(1)隐式转换
所谓隐式转换就是不需要声明就能进行的转换,进行转换的时候编译器不需要进行检查就能安全的转换,下面是可以进行隐式转换的数据类型:
从int、uint、long、ulong到float,以及从long或ulong到double的转换可能导致精度损失,但是不会影响数量级。当一种类型的值转换为大下相等或更大的一种类型时,发生扩大转换;当一种类型的值转换为较小的一种类型时,则发生收缩转换。
(2)显式转换
显式转换也可以称为强制转换,需要在代码中明确地声明要转换的类型。
(3)装箱拆箱
将值类型转换为引用类型的过程叫做装箱,相反,将引用类型转换为值类型的过程称为拆箱。
装箱
从上面例子可以看出,将值类型变量的值复制到装箱得到的对象中,装箱后改变值类型变量的值,并不会影响装箱对象的值。
拆箱
拆箱操作时要注意要符合类型一直的原则,否则会出现异常。
3、变量操作
1、声明变量
声明变量就是指定变量的名称和类型,未经声明的变量本身是不合法的,因此也没有办法在程序中使用。声明一个变量由一个类型和跟在后面的衣蛾或多个变量组成,多个变量间用逗号隔开,声明变量以分好结束。
c#变量名是一种标识符,应该符合标识符的命名规则。变量名区分大小写,规则如下:
•变量名只能由数字、字母和下划线组成;
•变量名的第一个符号只能是字母和下划线;
•不能使用关键字作为变量名;
•如果在一个语句块中定义了一个变量名,那么在变量的作用域内不能再定义相同名称的变量。
2、变量的作用域
变量的作用域就是可以访问该变量的代码区域,可以通过一下规则确定:
•只要字段所属的类在某个作用域内,其字段也在该作用域内;
•局部变量存在于表示声明该变量的块语句或者方法结束的封闭花括号之前的作用域内;
•在for、while或类似语句中声明的局部变量存在于该循环体内。
3、变量的赋值
使用赋值运算符“=”来给变量赋值,将等号右边的值赋给等号左边的变量。
4、常量
常量顾名思义是值固定不变的量,在系统编译时就已经确定好的,常量使用关键字const来创建,并且在创建常量是必须设置它的初始值。常量的类型只能为下列类型之一:sbyte、byte、short、ushort、int、uint、long、ulong、cahr、float、decimal、double、bool、string等。
总结:
上面重点介绍了变量与常量,重点掌握的是值类型、引用类型和枚举类型的概念及用法,并且了解类型的转换。掌握如何对变量进行操作,了解变量的作用域以及如何给变量赋值,以及常量的基本概念和基本类型。知识点内容不多,都很基础,但是也是最为重要的一部分知识点,万丈高楼平地起,我们要掌握好这些基础的知识点,才能在编程这条路越走越远,希望这篇文章能给你带来一定的帮助,谢谢支持!