黑马程序员技术交流社区

标题: 值类型和引用类型的区别 [打印本页]

作者: redlong    时间: 2014-4-3 23:17
标题: 值类型和引用类型的区别
本帖最后由 redlong 于 2014-4-5 23:22 编辑

关于值类型和引用类型的区别

作者: _Water    时间: 2014-4-3 23:44
打个比方说:值类型就是现金,要用直接用;引用类型是存折,要用还得先去银行取现。
声明一个值类型变量,编译器会在栈上分配一个空间,这个空间对应着该值类型变量,空间里存储的就是该变量的值。引用类型的实例分配在堆上,新建一个引用类型实例,得到的变量值对应的是该实例的内存分配地址,这就像银行账号一样。
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=法拉利
作者: 回忆~坚    时间: 2014-4-3 23:52
值类型的对象是直接存放具体值的,每个值都有自己的独立空间,例如,有两个同样的值,其中一个被修改,这并不会影响到另一个值;
引用类型的是存放的那个对象的存放地址,所以如果两个对象引用了它,一个对象里改了值,那么另一个对象的值也会变成这个新改的值,这两个对象用的是同一个数据。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2