打个比方说:值类型就是现金,要用直接用;引用类型是存折,要用还得先去银行取现。
声明一个值类型变量,编译器会在栈上分配一个空间,这个空间对应着该值类型变量,空间里存储的就是该变量的值。引用类型的实例分配在堆上,新建一个引用类型实例,得到的变量值对应的是该实例的内存分配地址,这就像银行账号一样。
1.值类型:就是一个包含实际数据的量。即当定义一个值类型的变量时,C#会根据它所声明的类型,以栈方式分配一块大小相适应的存储区域给这个变量,随后对这个变量的读或写操作就直接在这块内存区域进行
2.引用类型:一个引用类型的变量不存储它们所代表的实际数据,而是存储实际数据的引用。
引用类型分两步创建:首先在栈上创建一个引用变量,然后在堆上创建对象本身,再把这个内存的句柄(也是内存的首地址
namespace 值类型和引用类型的区别
{
public class Car
{
public int speed { get; set; }
public string carName { get; set; }
public Car(int speed, string carName)
{
this.speed = speed; this.carName = carName;
}
}
public class Program
{
static void Main(string[] args)
{
Car a = new Car(100, "宝马");
Car b = new Car(200, "奔驰");
int myspeed = a.speed;//测试值类型
a.speed = 150;
Car c = b;//测试引用类型
b.carName = "法拉利";
Console.WriteLine("myspeed={0}", myspeed);
Console.WriteLine("a.speed={0}", a.speed);
Console.WriteLine("b.carName={0}",b.carName);
Console.WriteLine("c.carName={0}", c.carName);
}
}
}
运行结果:
myspeed=100
a.speed=150
b.carName=法拉利
c.carName=法拉利 |