值类型与引用类型虽然经常见到但是对它们的具体含义和作用都是很模糊不清,今天先小总结一下:
谈到值类型与引用类型首先得说它们的概念了。值类型是基于值类型的变量直接包含值,将一个值类型赋给另一个值类型变量时,将复制包含的值。所有的值类型均隐式派生自System.ValueType.每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。引用类型的变量又称为对象,可存储对实际数据的引用。
下面谈谈它俩具体的区别:
值类型 表示实际数据 存储方式为将值存放在内存中 内存类型为存储在线程堆栈中 实例有intchar 、结构等;
引用类型  表示指向数据的引用  存储方式为包含内存堆中对象的地址  内存类型为:存储在托管堆中   实例:类、接口、数组、字符串等。
值类型包含的数据类型有:简单类型、枚举类型、结构类型。
引用类型包含的数据类型有:类类型、接口类型、Unicode字符串、数组类型、委托类型。
下面列一些具体的实例:
代码:
1.
static void Main(string[] args)
{
int a = 5;//a赋值5
int b =a //a赋给b
int b=10; //b赋值10
Console.WriteLine(a);//a的值输出,查看的变化是否影响
}
 
在实际运行时在线程堆栈中遇到int a = 5;存储a=5(int) 遇到int b =a;时首先存储变量b和类型,然后当a赋给b时把a的值5直接赋给了b也就是存储b=5(int);ab并不是同一块内存空间。
觉得同学举得的一个例子很形象:自己去邻居家做客时发现他家有一个和自己家一模一样的茶杯。当他用邻居家的茶杯喝完水回到家时发现自己家的茶杯还在,邻居家的茶杯也还在只是存放的位置不一样。
2.
代码
static void Main(string[] args)
        {
            int[] Array_a =new int[]{5};              // 定义一个数组,有一个无素5
            int[] Array_b =Array_a;                   // Array_a赋给 Array_b
            Array_b[0] = 10;                             // Array_b的唯一元素赋值10
            Console.WriteLine(Array_a[0]);     // Array_a的唯一元素的值输
                                                                  // ,查看Array_b中元素值的变
                                                                  // 化是否影响Array_a元素
        }
 
在运行时遇到int[] Array_a =new int[]{5};时在线程堆栈中存储Array_a(int[])在托管堆中为数据开辟出5个元素的空间也就是0-5托管堆中的0-5指向线程堆栈中的Array_a(int[])遇到int[] Array_b =Array_a;时在线程堆栈中存储Array_b(int[]),由于数组是引用类型所以会直接把Array_a(int[])对应的托管堆中的0-5指向Array_b(int[]),也就是说int[] Array_aint[] Array_b指向同一块内存区域所以当改变了数组b中的某一个值时数组a对应的值也发生改变。