从概念上讲,值类型是直接存储其值,而引用类型存储对其值的引用。这两种类型存储在内存的不一样地方。在C#中,必须在设计类型时就决定类型实例的行为。若是在编写代码时,不能理解引用类型和值类型的区别,那么将会给代码带来没必要要的异常。ide
从内存空间上看,值类型是在栈中操做,而引用类型则在堆中分配存储单元。栈在编译时就分配好内存空间,在代码中有栈的明肯定义,而堆是程序运行中动态分配的内存空间,能够根据程序的运行状况动态的分配内存的大小。所以,值类型老是在内存中占用一个预约义的字节数。而引用类型的变量则在堆中分配一个内存空间,这个内存空间包含的是对另外一个内存位置的引用,这个位置是托管堆中的一个地址,即存放变量实际值的地方。spa
也就是说值类型至关于现金,要用就直接用,而引用类型至关于存折,要用得先去银行取。设计
C#的全部值类型均隐式派生自System.ValueType,而System.ValueType直接派生自System.Object。即System.ValueType自己是一个类类型,而不是值类型,其关键在于ValueType重写了Equals()方法,从而对值类型按照实例的值来比较,而不是引用地址来比较。对象
枚举类型是一种独特的值类型,它用于声明一组具备相同性质的常量。使用枚举能够增长程序的可读性和可维护性。同时,枚举类型能够避免类型错误。内存
本质上,枚举就是定义一个类,该类里面的属性都是静态的弱数据类型的常量。string
在定义枚举类型时,若是不对其进行赋值,默认状况下,第一个枚举数的值为0,后面每一个枚举数的值依次递增1。it
在C#中使用关键字enum类声明枚举,其形式以下:编译
enum 枚举名class
{变量
list1=value1,
list2=value2,
list3=value3,
...
listN=valueN,
}
以下代码:
class Program
{
enum MyDate
{
Sun=0,
Mon=1,
Tue=2,
Wed=3,
Thi=4,
Fri=5,
Sat=6,
}
public static void Main(string[] args)
{
int k=(int)DateTime.Now.DayOfWeek;
switch(k)
{
case (int)MyDate.Sun:Console.WriteLine("星期天");break;
}
}
}
类型转换:
类型转换就是将一种类型转换成另外一种类型,转换能够是隐式转换,也能够是显示转换。对于类型转换,能够这么想象,大脑前面是一片内存,源和目标分别是两个大小不一样的内存块(由变量及数据的类型来决定),将源数据赋值给目标内存的过程,就是用目标内存块取套取源内存中的数据,能套多少算多少。
隐式转换:就是不须要声明就能进行的转换。当一种类型的值转换为大小相等或更大的另外一个类型时,则发生扩大转换,当一种类型值转换为较小的另外一类型时,则发生收缩转换。
显式转换:
显式转换也能够称为强制转换,须要在代码中明确地声明要转换的类型。若是要把高精度的变量的值赋值给低精度的变量,就须要使用显式转换。
例如:建立一个控制台应用程序,将double类型的x转换为int类型。
public static void Main(string[] args)
{
double x=1234566.789958546;
int y=(int)x;
Console.WriteLine(y);
Console.ReadLine();
}
显式类型转换也能够经过Convert关键字进行显示类型转换。
好比:建立一个控制台应用程序,经过Convert进行显示类型转换。
public static void Main(string[] args)
{
double a=123;
int b=Convert.ToInt32(a);
Console.WriteLine(b);
Console.ReadLine();
}
装箱和拆箱:
将值类型转换为引用类型的过程叫作装箱。相反,将引用类型转换为值类型的过程叫作拆箱。
装箱容许将值类型隐式转换为引用类型。好比:
int a=1;
object b=i;
//这里的b就是引用类型。
拆箱容许将引用类型显示转换为值类型。
装箱是将一个值类型转换为一个对象类型,而拆箱是将一个对象类型显示转换为一个值类型。对于装箱而言,他是将被装箱的值类型复制为一个副原本转换,而对于拆箱而言,须要注意类型的兼容性。例如:不能将一个值为:string的object类型转换为int类型。
常量就是其值固定不变的量。并且常量的值在编译时就已经肯定了。C#中使用const定义常量,而且在建立常量是必须设置它的初始值。常量就至关于每一个公民的×××号,一旦设置就不容许修改。