(4/∞)C#中的值类型和引用类型

在了解C#中的数据类型之前,先引入两个概念:

Stack线程栈:栈由操作系统管理,存放用于存放值类型引用类型在托管堆上的地址。栈式基于线程,一个线程包含一个栈。

GCHeap堆: 进程初始化后在进程地址上划分的内存空间,用于存储.NET运行时对象,由GC管理和释放。

以下为值类型引用类型表

 下面这个类的构造函数

    public Text()
	{
		int i = 1;
	}

 其中 i 这个整型变量就是存储在上面。

再比如说一个类 Test,由上面我们可以知道的是,类是一个引用类型,在内存的Heap堆地址中存放,而且类中的所有字段、属性均存放在堆中,而不是栈。

        class Test {
        public int a;
        public int A { get; set; }
        public string str;
    }

 这个类一旦被实例化,所有的成员都存放在堆内存中。

了解了这么多,那么值类型和引用类型具体有什么区别呢?

1赋值方式不同:将一个值类型赋值给拎一个值类型时,是直接赋值该变量的值进行传递,引用类型则是传递在堆上的地址。

2继承 :值类型无法派生出新的类型,而且所有的值类型都默认继承System.ValueType,但结构是可以继承接口的。下面就是一个结构体继承了接口,实现接口中的一个方法、一个属性、一个索引器。

        interface IFly {
        public void Fly();

        public string Name { get; set; }

        int this[int index] {
            get;
            set;
        }
    }
    struct Test : IFly
    {
        public int this[int index] { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }

        public string Name { get; set; }

        public void Fly()
        {
            
        }
    }

3.默认值:每个值类型都有一个默认的构造函数,默认值为0,引用类型默认为null。

4.存储位置 不用多说了吧?

猜你喜欢

转载自blog.csdn.net/qq_52690206/article/details/127054429
今日推荐