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#中值类型与引用类型的差别临时就记录这么多。兴许若有补充还会继续完好。

C#中值类型和引用类型的差别浅记的更多相关文章

  1. JavaScript中值类型和引用类型的区别

    JavaScript的数据类型分为两类:原始类型和对象类型.其中,原始类型包括:数字.字符串和布尔值.此外,JavaScript中还有两个特殊的原始值:null和undefined,它们既不是数字也不 ...

  2. JAVA中值类型和引用类型的不同(面试常考)

    转载:https://www.cnblogs.com/1ming/p/5227944.html 1. JAVA中值类型和引用类型的不同? [定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个 ...

  3. C#中值类型和引用类型图解

    举几个值类型和引用类型的内存配置: 值类型存储在栈中,引用类型堆里: 1,数组 数组是引用类型,但是数组的元素可以是值类型或引用类型 2. 结构 结构是值类型,简略的看个例子 struct sampl ...

  4. C#中值类型和引用类型

    本文将介绍C#类型系统中的值类型和引用类型,以及两者之间的一些区别.同时,还会介绍一下装箱和拆箱操作. 值类型和引用类型 首先,我们看看在C#中哪些类型是值类型,哪些类型是引用类型. 值类型: 基础数 ...

  5. java中值类型和引用类型的区别

    [定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个参数给另一个方法时,你在另一个方法中改变这个变量的值,那么调用这个方法是传入的变量的值也将改变. 值类型表示复制一个当前变量传给方法,当你 ...

  6. JavaScript中值类型与引用类型

    JavaScript中的变量类型有哪些? 值类型:字符串(string).数值(number).布尔值(boolean).null.undefined 引用类型:对象(Object).数组(Array ...

  7. .net中值类型、引用类型理解的c#代码示例

    下面是以前在公司的时候给别人讲解值类型.引用类型时创建的c#代码示例,从实际使用时的角度出发,对于初学者还是很有帮助的.这里并没有深入讲解值类型包含引用类型成员时(如struct)在内存中的存放情况等 ...

  8. JS中值类型和引用类型

    一.值类型 例子: var a=10; var b=a; a=20; console.log(b); 例子中,将a的值赋给了b,b=10,然后改变a的值不会影响b的值,a和b是独立的两份,互不影响. ...

  9. C#中值类型与引用类型通俗理解

    关于值类型和引用类型已经有很多人写了很多文章,但是很多人也只是停留在字面上的理解,如果采用一种通俗的方法来解释,想必很多人都会理解.我们都知道值类型存储在栈上,引用类型存储在堆上,引用类型都是xxx类 ...

随机推荐

  1. python--管道, 事件, 信号量, 进程池

    一 . 管道 (了解) from multiprocessing import Process, Pipe def f1(conn): # 管道的recv 里面不用写数字 from_main_proc ...

  2. python动态添加属性和方法

    ---恢复内容开始--- python动态添加属性: class Person(object): def __init__(self,newName,newAge): self.name = newN ...

  3. 树形 dp

    // ACM训练联盟周赛     C. Teemo's tree problem There is an apple tree in Teemo's yard. It contains n nodes ...

  4. 设计模式之建造者模式——Builder

    一.概述 Builder模式,中文名为建造者模式,又名生成器模式.构建者模式等,是创建型设计模式之一.用于将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 1.适用性: 对象 ...

  5. mysqldump 常见报错及解决

    mysqldump失败案例及解决: 1.mysqldump: Error 2020: Got packet bigger than 'max_allowed_packet' bytes when du ...

  6. BNUOJ 19297 Code Refactoring

    Code Refactoring Time Limit: 3000ms Memory Limit: 131072KB   This problem will be judged on UVA. Ori ...

  7. 九度oj 题目1208:10进制 VS 2进制

    题目描述: 对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数B,我们乘B为A的二进制逆序数.    例如对于十进制数173,它的二进制形式为10101101,逆序排列得到10 ...

  8. SQL2012 分页(最新)

    --提取分页数据,返回总记录数 ALTER procedure [dbo].[sp_Common_GetDataPaging_ReturnDataCount] ( @SqlString varchar ...

  9. 2.ruby基本语法,类的定义

    1.在ruby中的定义class,ruby中定义类也是以关键字class开头 后面带着类名,类名以大写开头.一个类的结束以关键字end 结束.如: class Customer end 2.ruby类 ...

  10. 【双向bfs】2017多校训练十 HDU 6171 Admiral

    [题意] 现在给出一个三角矩阵,如果0编号的在点(x,y)的话,可以和(x+1,y),(x-1,y),(x+1,y+1),(x-1,y-1)这些点进行交换. 我们每一次只能对0点和其他点进行交换.问最 ...