C#基础知识-引用类型和值类型的区别(六)
在第一篇中我们介绍了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#基础知识-引用类型和值类型的区别(六)的更多相关文章
- 实际举例C#引用类型和值类型的区别<网摘>
我们都知道,c#的两大数据类型分别为值类型和引用类型.很多人或许闭着眼睛都能说出值类型包括简单类型.结构体类型和枚举类型,引用类型包括自定义类.数组.接口.委托等,但是当被问及到二者之间的联系和区别, ...
- 【转】c#引用类型与值类型的区别大盘点
解析:CLR支持两种类型:值类型和引用类型.用Jeffrey Richter(<CLR via C#>作者)的话来说,“不理解引用类型和值类型区别的程序员将会把代码引入诡异的陷阱和诸多性能 ...
- C#中引用类型和值类型的区别,分别有哪些
C#的值类型包括:结构体(数值类型,bool型,用户定义的结构体),枚举,可空类型. C#的引用类型包括:数组,用户定义的类.接口.委托,object,字符串. 数组的元素,不管是引用类型还是值类型, ...
- C# 引用类型与值类型的区别
//引用类型(使用了class) class SomeRef{public Int32 x;} //值类型(使用了struct) struct SomeVal{public Int32 x;} sta ...
- 在JavaScript中引用类型和值类型的区别
一.存储方式不一样 基本数据类型 变量存储的是简单的数据段,存储的是具体的值,是轻量级的数据存储方式 引用类型 引用类型的值,可以由多个值构成的对象,引用类型的变量存储的是对象引用地址.引用类型是重量 ...
- NET基础(4):引用类型和值类型
CLR支持两种类型:引用类型和值类型.虽然FCL的大多数类型都是引用类型,但程序员用的最多的还是引用类型,引用类型总是从托管堆分配,c#的new操作符返回对象内存地址-即指向对象数据的内存地址.使用引 ...
- 《CLR via C#》读书笔记--基元类型、引用类型和值类型
编程语言的基元类型 编译器直接支持的数据类型称为基元类型.基元类型直接映射到Framework类库中存在的类型.例如:C#中的int直接映射到System.Int32类型.下表给出了C#基元类型与对应 ...
- CLR via C#(02)-基元类型、引用类型、值类型
http://www.cnblogs.com/qq0827/p/3281150.html 一. 基元类型 编译器能够直接支持的数据类型叫做基元类型.例如int, string等.基元类型和.NET框架 ...
- [CLR via C#]5.2 引用类型和值类型
原文:[CLR via C#]5.2 引用类型和值类型 CLR支持两种类型:引用类型和值类型. 虽然FCL中大多数都是引用类型,但开发人员用的最多的还是值类型.引用类型总是在托管堆上分配的,C#的ne ...
随机推荐
- sysbase 笔记
Alter 在已有数据的表中新增一个字段: ALTER table ciecdb.ciec.eci_mansmfile ADD num int default 0;
- MVC进阶篇(二)—路由机制
前言 这个东西好像,一般也不经常动,都用默认的即可.由于MVC模式在framework里面的解析机制,区别与webform模式,是采用解析路由机制的url.从来实例化视图列对象,然后对该action进 ...
- kali linux之主动信息收集(三层发现,四层发现)
三层发现: 比二层发现的优点即可路由,就是速度比二层慢,相对我们来说还是算快的,经常被边界防火墙过滤 ip icmp协议 OSI七层模型
- centos7多节点部署redis4.0.11集群
1.服务器集群服务器 redis节点node-i(192.168.0.168) 7001,7002node-ii(192.168.0.169) 7003,7004node-iii(192.168.0. ...
- 洛谷 P1546 最短网络 Agri-Net(最小生成树)
嗯... 题目链接:https://www.luogu.org/problemnew/show/P1546 首先不难看出这道题的思想是用了最小生成树,但是这道题有难点: 1.读题读不明白 2.不会读入 ...
- Qt 学习之路 2(59):使用流处理 XML
Qt 学习之路 2(59):使用流处理 XML 豆子 2013年7月25日 Qt 学习之路 2 18条评论 本章开始我们将了解到如何使用 Qt 处理 XML 格式的文档. XML(eXtensible ...
- Convert DataTable to List<T> where Class of List is Dynamic
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Da ...
- Week 3: Structured Types 5. Tuples and Lists Exercise: odd tuples
Exercise: odd tuples 5/5 points (graded) ESTIMATED TIME TO COMPLETE: 5 minutes Write a procedure cal ...
- Hibernate处理一个实体映射多张相同结构的数据表--动态映射
[转自] http://blog.csdn.net/majian_1987/article/details/8725197 LZ在项目中需要处理这样一个业务,每天都有终端设备上传GPS位置信息到服务端 ...
- 神马是代码简单的cmd模式,这就是!
小狼正在研究 “怎么查找连在一起的同色方块?”算法问题 ,突然感觉我是不是需要一种开发模式,不然感觉自己的代码好乱的. 可能是研究算法吧,导致小狼的思路特别清晰,加上也用了差不多1年的nodejs.s ...