在第一篇中我们介绍了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. 第五篇 Python内置函数

    内置函数 abs() delattr() hash() memoryview() set() all()    dict()  help() min() setattr() any()  dir()  ...

  2. Linux crontab定时任务命令使用记录

    安装crontab 使用 crontab -v 如果提示没有该命令,则需要安装.安装也很简单,推荐使用yum安装.一条命令即可(yum install crontab),这里不多介绍. 下面是一些基础 ...

  3. CentOS修改默认yum源为国内yum镜像源

    修改CentOS默认yum源为mirrors.163.com 1.首先备份系统自带yum源配置文件/etc/yum.repos.d/CentOS-Base.repomv /etc/yum.repos. ...

  4. 怎样将结构完全一样的两个表的内容合并到一个表中,SQL语句

      标签: SQL合并数据 2013-08-21 10:41 489人阅读 评论(0) 收藏 举报  分类: Oracle数据库(14)  select * into 新表名 from (select ...

  5. Ubuntu Server 中实际内存与物理内存不相等的问题

    记录 来源 v2ex,提到了一个平时不是很起眼的问题,Ubuntu Server 中系统默认会占用 128M 内存,用于 CVM 内部的 kdump 服务. 科普 查看 CVM 所拥有的物理内存 通过 ...

  6. php 利用 json 传递数组之中文乱码最新解决办法

    json好用,但是如果数据中有中文就会出乱子了,网上解决办法多半是设置utf-8编码或转换字符编码 以下是我的解决办法,利用php的urlencode.urldecode函数(其实也是一种转换编码吧) ...

  7. 使用IDEA完成maven整合SSH框架时抛出Hibernate : Mapping (RESOURCE) not found

    切入主题,看看今天的错误是如何发生的: 首先这是我的项目路径,java 是 Sources Root , resources 是 Resources Root ,放了所需要的配置文件,其中 Hiber ...

  8. C. Enlarge GCD Codeforces Round #511 (Div. 2)【数学】

    题目: Mr. F has nn positive integers, a1,a2,…,an. He thinks the greatest common divisor of these integ ...

  9. Bootstrap4 导航栏元素居右

    Bootstrap 4正解: .ml-auto元素居右 .mr-auto元素居左 在某度上查了半小时还是没查出什么名堂,搜出来的方法大多都是Bootstrap3的,实测pull-right或navba ...

  10. VBS常用脚本及其解说一览

    取得本机IP strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strCo ...