C#中值类型与引用类型的区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hpf247/article/details/82879884

值类型是直接存储一个数值,而引用类型是存储对值的引用,这两种类型分别存储在不用的内存区域。而从内存上看,值类型是在栈中的操作,而引用类型是在堆中的操作。值类型是具体的那个数值所占用的空间大小,而引用类型是存放那个数值的空间地址。
我们知道,在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。

猜你喜欢

转载自blog.csdn.net/hpf247/article/details/82879884
今日推荐