C#中值类型与引用类型的区别
值类型是直接存储一个数值,而引用类型是存储对值的引用,这两种类型分别存储在不用的内存区域。而从内存上看,值类型是在栈中的操作,而引用类型是在堆中的操作。值类型是具体的那个数值所占用的空间大小,而引用类型是存放那个数值的空间地址。
我们知道,在C#中,结构体是值类型,类是引用类型。值类型可以减少对堆的管理、使用,减少垃圾回收,表现出更好的性能。但是值类型也有不好的一面,比如会涉及到装箱拆箱等操作。而C#中的委托(Delegate)是一种引用类型,该引用类型与其它引用类型有所不同,在委托对象的引用中存放的不是对数据的引用,而是存放对方法的引用,即在委托的内部包含一个指向某个方法的指针。通过使用委托把方法的引用封装在委托对象中,然后将委托对象传递给调用引用方法的代码。
通过代码说明如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Stock
{
class Program
{
static void Main(string[] args)
{
Refer.show(); //静态方法不需要实例化
}
}
public class stamp //定义一个stamp类
{
public string Name { get; set; } //作为引用类型
public int age { get; set; } //作为值类型
}
public static class Refer //定义静态类
{
public static void show() //定义静态方法
{
stamp stamp1 = new stamp { Name = "xiaoming", age = 22 };
stamp stamp2 = new stamp { Name = "xiaoqing", age = 23 };
int age = stamp1.age;
stamp1.age = 34;
stamp stamp3 = stamp2; //引用类型
stamp2.Name = "xaiohuang";
Console.WriteLine("stamp1's age : {0}", stamp1.age);
Console.WriteLine("Current age : {0}", age);
Console.WriteLine("stamp2's Name : {0}", stamp2.Name);
Console.WriteLine("stamp3's Name : {0}", stamp3.Name);
Console.ReadLine();
}
}
}
运行结果如下:
运行结果分析:可以看到,当改变Stamp1.age的值时,变量age的值没跟着改变。而在改变了stamp2.Name的值的时候,stamp2.Name的值跟着改变了。这是因为引用类型只是包含堆上面数据区域中地址的引用,他们都指向了同一块内存区域。所以当stamp3引用stamp2时(stamp stamp3 = stamp2;),stamp2改变的值是能够影响stamp3的。当然,改变stamp3的值也能够影响到stamp2。