在第一篇中我们介绍了C#中基本的15种数据类型,这15种数据类型中又分为两大类,一种是值类型,一种是引用类型。值类型有sbyte、short、long、int、byte、ushort、uint、ulong、float、double、bool,引用类型有object、string、class类型,这两大类最大的区别就是在内存中存储的位置、方式不一样。(当我们打开运行一个程序的时候,实际上就会把当前程序需要执行的资源从硬盘加载到内存中,再把内存的数据送去CPU处理),现在来看一下它们是如何来进行存储的:

//引用类型

publicclassTestObject

{

publicintNumberA;

}

//值类型

publicstructTestValue

{

publicintNumberB;

}

在程序入口处调用:

staticvoidMain(string[]args)

{

//创建一个TestObject对象,命名obj1

TestObjectobj1 = newTestObject();

//创建一个TestValue对象,命名value1

TestValuevalue1 = newTestValue();

//为变量NumberA赋值

obj1.NumberA = 1;

//为变量NumberB赋值

value1.NumberB = 6;

//输出两个变量的值

Console.Write("obj1={0} , value1={1}",obj1.NumberA, value1.NumberB);

Console.ReadKey();

}

当我们实例化对象时,在内存中是这样存储的:

简单来说,当我们实例化一个对象时如果是值类型那么这对象中的数据将会和对象一起存储在内存栈中,如果是实例化一个引用类型的对象时在内存栈中就会保存这个对象在内存堆中的地址。

下面我们继续实例化两个同样的类时看看不同类型的类有什么区别?

staticvoidMain(string[]args)

{

//创建一个TestObject对象,命名obj1

TestObjectobj1 = newTestObject();

//创建一个TestValue对象,命名value1

TestValuevalue1 = newTestValue();

//为变量NumberA赋值

obj1.NumberA = 1;

//为变量NumberB赋值

value1.NumberB = 6;

TestObjectobj2 = obj1;

obj2.NumberA= 111;

TestValuevalue2 = value1;

value2.NumberB= 666;

//输出两个变量的值

Console.Write("obj1={0} , value1={1} , obj2={2} , value2={3}",obj1.NumberA, value1.NumberB, obj2.NumberA, value2.NumberB);

Console.ReadKey();

}

到这里猜猜会输出什么值?先思考一下,再看下面的答案。

是的没错,结果就是:obj1=111 , value1=6 , obj2=111 , value2=666。

为什么会出现这样的结果呢,在上面代码中明明obj1.NumberA已经赋值了1 但是会被obj2改变,value1和value2却没有受到影响,原因就是值类型和引用类型的存储方式的不同,当你把一个引用类型对象赋值给另外一个引用类型的对象时便把它们都指向了同一个地址,所以改变的是同一个对象的值,下面来看看内存中的示意图:

当将obj1赋值给obj2时相当于指向了同一个堆中的对象(内存地址)。

string不可变类型

在第一篇中我们还提到了string类型是不可变的类型,例如:

string a=”AAA”;

在内存中开辟了一块空间存储字符串”AAA”

string a=”BBB”;

在内存中再开辟一块空间存储字符串”BBB”

这样如果变量a改变了值的话不会像值类型中的变量一样修改本身的值而且另外划分一块空间存储。

想要详细了解的小伙伴可以再查查相关的资料。

 有兴趣的可以关注一下我个人的微信公众号:

       Net之道

C#基础知识-引用类型和值类型的区别(六)的更多相关文章

  1. 实际举例C#引用类型和值类型的区别<网摘>

    我们都知道,c#的两大数据类型分别为值类型和引用类型.很多人或许闭着眼睛都能说出值类型包括简单类型.结构体类型和枚举类型,引用类型包括自定义类.数组.接口.委托等,但是当被问及到二者之间的联系和区别, ...

  2. 【转】c#引用类型与值类型的区别大盘点

    解析:CLR支持两种类型:值类型和引用类型.用Jeffrey Richter(<CLR via C#>作者)的话来说,“不理解引用类型和值类型区别的程序员将会把代码引入诡异的陷阱和诸多性能 ...

  3. C#中引用类型和值类型的区别,分别有哪些

    C#的值类型包括:结构体(数值类型,bool型,用户定义的结构体),枚举,可空类型. C#的引用类型包括:数组,用户定义的类.接口.委托,object,字符串. 数组的元素,不管是引用类型还是值类型, ...

  4. C# 引用类型与值类型的区别

    //引用类型(使用了class) class SomeRef{public Int32 x;} //值类型(使用了struct) struct SomeVal{public Int32 x;} sta ...

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

    一.存储方式不一样 基本数据类型 变量存储的是简单的数据段,存储的是具体的值,是轻量级的数据存储方式 引用类型 引用类型的值,可以由多个值构成的对象,引用类型的变量存储的是对象引用地址.引用类型是重量 ...

  6. NET基础(4):引用类型和值类型

    CLR支持两种类型:引用类型和值类型.虽然FCL的大多数类型都是引用类型,但程序员用的最多的还是引用类型,引用类型总是从托管堆分配,c#的new操作符返回对象内存地址-即指向对象数据的内存地址.使用引 ...

  7. 《CLR via C#》读书笔记--基元类型、引用类型和值类型

    编程语言的基元类型 编译器直接支持的数据类型称为基元类型.基元类型直接映射到Framework类库中存在的类型.例如:C#中的int直接映射到System.Int32类型.下表给出了C#基元类型与对应 ...

  8. CLR via C#(02)-基元类型、引用类型、值类型

    http://www.cnblogs.com/qq0827/p/3281150.html 一. 基元类型 编译器能够直接支持的数据类型叫做基元类型.例如int, string等.基元类型和.NET框架 ...

  9. [CLR via C#]5.2 引用类型和值类型

    原文:[CLR via C#]5.2 引用类型和值类型 CLR支持两种类型:引用类型和值类型. 虽然FCL中大多数都是引用类型,但开发人员用的最多的还是值类型.引用类型总是在托管堆上分配的,C#的ne ...

随机推荐

  1. day08.3-apache网页服务

    1. 安装软件:yum   install   httpd   -y 2. 查看配置文件:vim   /etc/httpd/conf/httpd.cof,其中,"Listen   80&qu ...

  2. jsonp的原理及其使用

    原理: 1.创建script标签 2.src远程地址 3.返回的数据必须为js格式 1.因为浏览器处于安全原因不允许跨域请求,但是允许跨域倒入js文件,所以需要创建script标签 2.src远程地址 ...

  3. SHELL编程之条件判断

    一.if 语句结构 (1)单分支语句结构 if  条件测试操作 then  命令序列 fi #!/bin/bash MOUNT_DIR="/media/cdrom/" #-d $M ...

  4. P2053 [SCOI2007]修车 费用流

    $ \color{#0066ff}{ 题目描述 }$ 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M ...

  5. XMLHttpRequest 与 Ajax 概要

    关于XMLHttpRequest 开发者使用XMLHttpRequest对象与服务端进行交互(发送http请求.接受返回数据等),可以在不打断用户下一步操作的情况下刷新局部页面.XMLHttpRequ ...

  6. Windows Server 2008 R2中IIS7.5配置完网站权限不足问题的解决办法:

    Windows Server 2008 R2中IIS7.5配置完网站权限不足问题的解决办法:常见问题:HTTP 错误 500.0 - Internal Server Error无法显示页面,因为发生内 ...

  7. java 关于数组 计数的面试题

    题目:用面向对象的方法求出数组中重复 value 的个数 :  1  出现:1 次3 出现:2 次8 出现:3 次2 出现:4 提供数组 :  int[] arr = {1,4,1,4,2,5,4,5 ...

  8. POJ - 3090 gcd水题

    大概题意就是求\(1 \le i,j \le n\)的\(gcd(i,j) = 1\)的个数+2(对于0的特判) 正解应该是欧拉函数或者高逼格的莫比乌斯反演 但数据实在太水直接打表算了 /*H E A ...

  9. GDCM

    gdcmconv: gdcm 2.2.4 $Date$ Usage: gdcmconv [OPTION] input.dcm   output.dcm Convert a DICOM file int ...

  10. Hadoop基础入门

    一.hadoop是什么? (1)Hadoop是一个开源的框架,可编写和运行分布式应用处理大规模数据,是专为离线和大规模数据分析而设计的,并不适合那种对几个记录随机读写的在线事务处理模式.Hadoop= ...