C#中的变量类型根据其定义可以分为两种,一种是值类型,另一种是引用类型,这两种类型的差异在于数据的存储方式,
值类型的变量本身直接存储数据,而引用类型则存储实际数据的引用,程序通过引用找到真正的数据。
值类型:值类型变量直接存储其数据值,主要包含整数类型、浮点类型以及布尔类型等等,值类型变量在堆栈中进行分配,因此效率很高,使用值类型的主要目的是为了提高性能。
值类型的特性:
1.值类型变量存储在堆栈中
2.访问值类型变量,一般都会访问其实例
3.每个值类型变量都有自己的数据副本,因此对一个值类型变量的操作不会影响其他变量
4.复制值类型变量时,复制的是变量的值,而不是变量的地址
5.值类型的变量不能为null值,必须有一个确定的值
6.值类型是从System.ValueType类继承的类型
基本的值类型:
1.整数类型(代表一种没有小数点的整数数值,在局部变量时,要对其初始化,byte是一个8位无符号整数(0-255取值范围内))
2.浮点类型 single(主要包含了float和double两种数值类型,如果不做任何操作,其默认值包含小数点的数值都被认为是double类型,
float:如果要将数值以float类型来处理,就应该通过强制使用f和F将其强制指定为float类型。
float theMySum=9.27f;
float theMySums=1.27F;
double:如果要将数值以double类型来处理,就应该通过强制使用d和D将其强制指定为double类型
double myDou=927d;
double mydou=927D;
注意:如果需要使用float类型变量时,必须在数值的后面跟随f或F,否则编译器会直接将其作为double类型处理,
也可以在double类型的值前面加上float,对其进行强制转换double mydou=float(927.77);
3.布尔类型:布尔类型主要用来表示true/false值,一个布尔类型的变量,其值只能是true或者false,
不能将其值他的值指定给布尔类型变量,布尔类型变量不能与其他类型进行转换,bool x=927,这样的赋值显然是错误的,编译器会返回提示"常量927无法转换为bool",
布尔类型变量大多数被应用到流程控制语句,例如循环语句或者if语句等,
注意:在定义全局变量时,如果没有特定的要求不要对其进行初始化,整数类型和浮点类型的默认初始化值为0,布尔类型的初始化为false
引用类型:引用类型是构建C#应用程序的主要对象类型数据,在应用程序执行的过程中,预先定义的对象类型以new创建对象实例,
并存储在堆栈中,堆栈是一种由系统弹性配置的内存空间,没有特定大小及存活时间,因此可以被弹性的运用于对象的访问
引用类型具有以下特性:
1.必须在托管堆中为引用类型变量分配内存
2.必须使用new关键字来创建引用类型变量
3.在托管堆中分配的每个对象都有与之相关的附加成员,这些成员必须得初始化
4.引用类型变量是由垃圾回收机制来管理的
5.多个引用类型对象可以引用同一个对象,这种情形下,对一个变量的操作会影响另一个变量所引用的同一对象
6.引用类型被赋值前都是null
值类型和引用类型的区别:
在概念上来看,值类型直接存储其值,而引用类型存储对其值的引用,这两个类型存储在这内存的不同地方,从内存空间上来看,值类型是在栈中操作,而引用类型则在堆中分配内存,栈在编译时就分配好内存,在代码中有栈的明确定义而堆是程序运行中动态分配的内存空间,可以根据应用程序的运行情况动态地分配内存的大小,因此值类型总是在内存中占用一个预定义的字节数,而引用类型的变量在栈中分配一个内存空间,这个内存空间包含的是另一个内存位置的引用,这个位置是托管堆中的一个地址
枚举类型:在定义枚举类型时,如果不对其进行赋值,默认情况下,第一个枚举类型的值为0,而后面的枚举数依次递增1
其中,大括号{}中的内容为枚举值列表,每一个枚举值对应一个枚举值名称
/// <summary> /// 定义一个枚举类型来判断今天是星期几 /// </summary> enum MyDate { Sun = 0, Mon = 1, Tue = 2, Wed = 3, Thi = 4, Fri = 5, Sat = 6 } static void Main(string[] args) { int k = Convert.ToInt32(DateTime.Now.DayOfWeek); switch (k) { case (int)MyDate.Sun: Console.WriteLine("周日"); break; case (int)MyDate.Mon: Console.WriteLine("周一"); break; case (int)MyDate.Tue: Console.WriteLine("周二"); break; case (int)MyDate.Wed: Console.WriteLine("周三"); break; case (int)MyDate.Thi: Console.WriteLine("周四"); break; case (int)MyDate.Fri: Console.WriteLine("周五"); break; case (int)MyDate.Sat: Console.WriteLine("周六"); break; default: break; } Console.Read(); }
类型转换:类型转换就是讲一种类型转换成另一种类型,转换类型可以是隐式转换或者显示转换
隐式转换:当一种类型的值转换为大小相等或者更大的另一类型时,则发生扩大转换,当一种类型值转换为较小的另一种类型,则发生收缩转换
【将Int类型的值隐式转换成long类型】
int i=927;
long j=i; //隐式转换为long类型
显式转换:显示转换也可以称为强制转换,需要类型之间进行转换,就需要使用显示转换
【将double类型的x进行显示转换】
double x = 19810927.102;
int y = (int)x;
double X = 19810927.102;
int Y = Convert.ToInt32(X);
装箱和拆箱:将值类型转换为引用类型的过程叫做装箱,反之,将引用类型转换为值类型的过程叫做拆箱
【装箱允许将值类型隐式转换成引用类型】
int i = 2008; object obj = i; Console.WriteLine("1.i的值为为{0},装箱之后的对象为{1}",i,obj); i = 927; Console.WriteLine("2.i的值为为{0},装箱之后的对象为{1}", i, obj);
注意的是:将值类型变量复制到装箱得到的对象中,装箱后改变值类型变量时,并不会影响装箱对象的值
【拆箱允许将引用类型显示转换成值类型】
int i = 112; object obj = i; Console.WriteLine("1.i的值为为{0},装箱之后的对象为{1}",i,obj); int j =(int)obj ; Console.WriteLine("2.i的值为为{0},装箱之后的对象为{1}", i, obj);
注意:拆箱后得到的值类型数据和装箱的值相等,但是在执行拆箱中,要符合类型一致的原则,否则会出现异常