值类型和引用类型美洲杯在哪买球

一.数据类型

先简单介绍一下它们:

    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 类型:

          指针类型不从对象继承,并且指针类型与 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中将一些简单的,常用的,内存占用小的对象设置为值类型,大大提高了整个CLR的效率。

          2.不同点

 

             1.值类型直接储存在内存栈中,引用类型在栈中储存它在堆中内存单位的地址。

装箱与拆箱:

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

     为什么会发生装箱:

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

         因为值类型与引用类型在CLR中的内存管理方式不同,所以当值类型在程序中需要向引用类型转化的时候就会发生装箱。也就是当值类型的实例对象需要在一个程序作用域的场景下,转化成为不从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("--------------------------------------");   

值类型和引用类型的区别:

本文由美洲杯在哪买球发布于计算机教程,转载请注明出处:值类型和引用类型美洲杯在哪买球

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。