zoukankan      html  css  js  c++  java
  • C#中值类型和引用类型的差别浅记

    C#中值类型和引用类型的差别浅记


            在C#中,变量的类型分为两种。各自是值类型和引用类型。

            值类型的变量直接存储值,说得更详细一些,就是值类型变量在内存中直接存储它们自身的值,如代码所看到的,

     

            int x = 2;

     

            值类型变量x。在内存中的某处直接存储了它自身的值:2。

     

            引用类型的变量存储的是对其对象的引用。更进一步说,就是引用类型变量在内存中直接存储了一个指向它处的引用。而引用所指的对象则保存在引用类型变量所指的内存中。如代码所看到的。

     

            public class Thing

            {

                  int x;

            }

     

                 Thing  x  =   newThing();

     

            引用类型变量x,在对它进行声明时。会在内存中的某处分配一块空间存储它自身的内容,而我们所使用的变量x,实际上则是一个指向了它自身内容的引用。

            注意。稍后我们会说到,引用类型的变量,它自身的内容总是保存在堆中。而值类型的变量,它自身的值总是分配在声明它的地方(可能在栈中,也可能在堆中)。

     

            那么。C#中的值类型与引用类型,都有哪些差别呢,让我们来列举一下。

     

            1、由于值类型变量存储的就是它自身的值。所以它总是包括一个值。不能为空。而引用类型变量存储的是一个指向它处的引用,所以能够为空(null),表示不包括值,即没有指向内存中的不论什么地方。

     

            2、引用类型直接继承自System.Object类,与此不同。值类型直接继承自System.ValueType类,而System.ValueType类直接继承自System.Object类。作为全部类型的基类,System.Object类提供了一组方法,这些方法在全部类型中都能找到,如ToString方法等。System.ValueType类继承了System.Object类,它并没有加入不论什么新成员,而仅仅是覆盖了所继承的一些方法。使其更适合于值类型。注意,我们能够使用Type.IsValueType属性来推断一个类型是否为值类型,如代码所看到的

     

            Thing x = new Thing();

     

            if( x.GetType().IsValueType ) {

     

               // Todo Something

             }

     

            3、引用类型对象和值类型对象。它们在内存中的存储分配规则不同。

    引用类型对象总是分配在堆中;而值类型对象总是分配在它被声明的地方:若值类型对象作为字段被声明。那么它将尾随其所属的对象被分配;若值类型对象作为局部变量被声明,那么它将存储在栈上。如代码所看到的。

     

            public class Thing

            {

                  int x; // x作为字段,x为值类型,尾随引用类型的对象被分配,位于堆上

            }

     

            Thing x = new Thing();

     

     

            int x = 2;// x作为局部变量,x为值类型,位于栈上

     

     

            4、全部的值类型都是密封的(seal)。无法派生出新类型,而引用类型则能够继续派生。这也是值类型更适合于数据存储,而引用类型更适合于定义行为的原因。

     

            最后。把C#中值类型与引用类型的划分所有列举一下:

     

    作为值类型的数据类型

    bool  byte   char              decimal        double          float  int   long     short      sbyte     uint        ulong     ushort enum     struct

    作为引用类型的数据类型

    class      object    string     interface              delegate

     

     

            好了,关于C#中值类型与引用类型的差别临时就记录这么多。兴许若有补充还会继续完好。

  • 相关阅读:
    1.选择排序法
    24.桌面移动qq
    23.控制语句题目
    23.位运算实现加法
    22.dll调用技术
    21.MFC进制转换工具
    2.CString转换到char*
    20.原码反码补码及图形化界面
    11gR2 Agent 简介
    RAC数据库后台进程介绍
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/6839122.html
Copyright © 2011-2022 走看看