澳门至尊网站-首页

您的位置:澳门至尊网站 > 技术教程 > 值类型和引用类型,数据类型及差异

值类型和引用类型,数据类型及差异

2019-10-22 05:51

一日千里.数据类型

先简介一下它们:

    1. 值类型

严酷来讲应该是上边的那么些:值类型富含:结构体(数值类型,bool型,客商定义的结构体),枚举,可空类型。

类型 描述 范围 默认值
bool 布尔值 True 或 False False
byte 8 位无符号整数 0 到 255 0
char 16 位 Unicode 字符 U +0000 到 U +ffff ''
decimal 128 位精确的十进制值,28-29 有效位数 (-7.9 x 1028 到 7.9 x 1028) / 100 到 28 0.0M
double 64 位双精度浮点型 (+/-)5.0 x 10-324 到 (+/-)1.7 x 10308 0.0D
float 32 位单精度浮点型 -3.4 x 1038 到 + 3.4 x 1038 0.0F
int 32 位有符号整数类型 -2,147,483,648 到 2,147,483,647 0
long 64 位有符号整数类型 -923,372,036,854,775,808 到 9,223,372,036,854,775,807 0L
sbyte 8 位有符号整数类型 -128 到 127 0
short 16 位有符号整数类型 -32,768 到 32,767 0
uint 32 位无符号整数类型 0 到 4,294,967,295 0
ulong 64 位无符号整数类型 0 到 18,446,744,073,709,551,615 0
ushort 16 位无符号整数类型 0 到 65,535 0

援引类型富含:数组,客商定义的类、接口、委托,object,字符串

    1. 援引类型
      1. 数组
      2. 类(自定义类)
      3. 字符串
      4. 接口
      5. Object
      6. 委托
    2. 指针类型

      1. 法定给出的求证

        1.   在指针类型中的 * 以前线指挥部定的品种被称之为“referrent 类型”。 以下任日新月异类型均可为 referrent 类型:

          • 别的整型类型:sbyte、byte、short、ushort、int、uint、long、ulong。
          • 别的浮点类型:浮点、双精度。
          • 字符。
          • 布尔型。
          • 小数。
          • 任何枚举类型。
          • 其他指针类型。 那允许如 void** 的表明式。
          • 其他仅满含非托管类型字段的客商定义的结构类型。

          指针类型不从对象连绵起伏,何况指针类型与 object 之间不设有转变。 另外,装箱和注销装箱不扶助指针。可是,你可在不一样的指针类型之间以致指针类型和整型之间进行退换。

          在同多少个宣称中宣示多少个指针时,星号 (*) 仅与功底项目一齐写入;而不是作为各样指针名称的前缀。 举例:

          C# 复制

          int* p1, p2, p3;   // Ok
          int *p1, *p2, *p3;   // Invalid in C#
          

          指南针无法指向援引或含有援用的结构,因为不可能对指标引用举行垃圾回收,固然有指针指向它也是如此。垃圾回笼器并不追踪是不是有其他项指标指针指向对象。

        2. 指南针轻便利用

          1.   

                //指针
                        unsafe
                        {
                            char* cptr = stackalloc char[26];//分配内存
                            //stringAppend();
                            for (int i = 0; i < 26; i++)
                            {
                                cptr[i] = (char)(i + 65);
                            }
                            for (int i = 0; i < 26; i++)
                            {
                                Console.WriteLine(string.Format("{0}:{1}",(int)&cptr[i],cptr[i]));
                            }
                        }
            

            概念四个char类型指针并分配26字节内部存款和储蓄器,for循环给指针赋值,输出int类型指针地址及它转化位string的值:

          2. 结果为:

          3. 图片 1

             

          4. 在内存中查看 :调节和测量检验-》窗口-》内部存储器-》内存1 ,大家把int类型指针值复制到地址栏,vs自动转接位十六进制, 右键-》带符号彰显 ,获得结果为char对应的数字

             

干什么要统一准备值类型:

二. 基本项目首要差距

  1. 值类型没有要求从托管堆分配
  2. 援用类型发生的实例对象在托管堆上都会有一点点外加的分子,这么些成员必需开首化
  3. 值类型不应用GC垃圾回收调节,效用域截至后,会自行释放。
    1. 中央项目:值类型,援用类型
      1. 相同点:  
        1. 援引类型可以兑现接口,值类型此中的结构体也足以完成接口;
        2. 引用类型和值类型都承继自System.Object类。

     综上,值类型更有成效,所以在.NET上将部分简言之的,常用的,内部存款和储蓄器占用小的目的设置为值类型,大大提升了整个CL安德拉的作用。

          2.不同点

 

             1.值门类直接积存在内部存款和储蓄器栈中,引用类型在栈中积累它在堆中内部存款和储蓄器单位的地址。

装箱与拆箱:

             2.值类型存取速度快,援引类型存取速度慢。

     缘何会发出装箱:

             3.值类型表示其实数据,引用类型表示针对存储在内存堆中的数据的指针或引用。

         因为值类型与援用类型在CL大切诺基中的内部存款和储蓄器管理措施不相同,所以当班值日类型在程序中必要向援引类型转变的时候就能够时有爆发装箱。相当于当班值日类型的实例对象要求在七个主次功能域的现象下,转形成为不从System.ValueType承袭的此外多少个门类的靶辰时,装箱就能生出。

             4.值类型传承自System.ValueType,援用类型承接自System.Object。

      装箱有怎么样风险:

             5. 栈的内部存款和储蓄器分配是全自动释放;而堆在.NET中会有GC来刑满释放解除劳教。

          因为设计值类型的本心是为了进步作用。可是当装箱发生时,值类型会转接成为引用类型,这一年,功用未有收获别的提高。反而因为装箱,拆箱有相当的大可能率再也数十二遍的发生,反而让效用更受影响。

二. 类型之占用内部存款和储蓄器

 

    1.值种类占用内部存款和储蓄器

 

            Console.WriteLine("bool size:{0}", sizeof(bool));
            Console.WriteLine("byte size:{0}", sizeof(byte));
            Console.WriteLine("char size:{0}", sizeof(char));
            Console.WriteLine("decimal size:{0}", sizeof(decimal));
            Console.WriteLine("double size:{0}", sizeof(double));
            Console.WriteLine("float size:{0}", sizeof(float));
            Console.WriteLine("int size:{0}", sizeof(int));
            Console.WriteLine("long size:{0}", sizeof(long));
            Console.WriteLine("sbyte size:{0}", sizeof(sbyte));
            Console.WriteLine("short size:{0}", sizeof(short));
            Console.WriteLine("uint size:{0}", sizeof(uint));
            Console.WriteLine("ulong size:{0}", sizeof(ulong));
            Console.WriteLine("ushort size:{0}", sizeof(ushort));
            Console.WriteLine("--------------------------------------");   

值类型和援引类型的界别:

      图片 2

1.    值类型的多少存款和储蓄在内部存储器的栈中;援用类型的多寡存款和储蓄在内部存款和储蓄器的堆中,而内部存款和储蓄器单元中只存放堆中目的的
地址。

        · 1字节=8位 与值类型描述生龙活虎致;

2.     值类型存取速度快,援用类型存取速度慢。

    2. 引用类型占用内部存款和储蓄器不稳固, 根据它所创建的目的对应的数额大小不等而分歧。

3.     值类型表示其实数目,援用类型表示针对存款和储蓄在内部存款和储蓄器堆中的数据的指针或援用

 

4.     值类型承接自System.ValueType,援用类型承接自System.Object

5.     栈的内部存款和储蓄器分配是自动释放;而堆在.NET中会有GC来释放       

6.      值类型的变量直接寄存实际的数量,而援用类型的变量寄存的则是数据的地址,即对象的援引。

7. 值类型变量直接把变量的值保存在仓库中,引用类型的变量把实际数指标地方保存在仓库中,而实际上

数码则保留在堆中。注意,堆和储藏室是多少个例外的定义,在内部存款和储蓄器中的存款和储蓄地方也不龙腾虎跃致,堆平时用来存款和储蓄

可变长度的数额,如字符串类型;而商旅则用于存款和储蓄固定长度的多寡,如整型类型的多寡int(各个int变量

侵占多个字节)。由数据存款和储蓄的岗位能够识破,当把贰个值变量赋给另三个值变量时,会在货仓中保留两

个一模二样的值;而把壹个引用变量赋给另一个引用变量,则会在库房中保存对同贰个堆地点的四个引用

,即在饭馆中保留的是同五个堆的地址。在张开数据操作时,对于值类型,由于各样变量都有投机的值,

之所以对一个变量的操作不会潜移暗化到其余变量;对于引用类型的变量,对三个变量的数码进行操作正是对那

个变量在堆中的数据开展操作,借使四个援用类型的变量援引同二个对象,实际意义就是它们在库房中保

存的堆的地方同样,因而对一个变量的操作就能够影响到引用同叁个对象的另二个变量。

本文由澳门至尊网站发布于技术教程,转载请注明出处:值类型和引用类型,数据类型及差异

关键词: