C#基础(四)--值类型和引用类型,栈和堆的含义

时间:2023-02-22 10:59:18

本文主要是讨论栈和堆的含义,也就是讨论C#的两种类据类型值类型和引用类型;

虽然我们在.net中的框架类库中,大多是引用类型,但是我们程序员用得最多的还是值类型。

引用类型如:string,Object,class等总是在从托管堆上分配的,C#中new操作符返回对象的内存地址--也就是指向对象数据的内存地址。

  以下是值类型与引用类型的表:

C#基础(四)--值类型和引用类型,栈和堆的含义

   我们来看下面一段代码:

    首先在类中声明一个class类,和一个struct结构,如图:

C#基础(四)--值类型和引用类型,栈和堆的含义

  并使用在程序入口调用它们,如图

C#基础(四)--值类型和引用类型,栈和堆的含义

    现在我们来看一看,它们在内存当中是如何存储的?

C#基础(四)--值类型和引用类型,栈和堆的含义

从这张图可以看出,class(类)实例化出来的对象,指向了内存堆中分配的空间

struct(结构) 实例化出来的对象,是在内存栈中分配

   接下来,我们再来在上面的程序做如下修改:

   C#基础(四)--值类型和引用类型,栈和堆的含义

红框,代码定义一个class实例化对象s2,然后把对象s1赋值给s2

    蓝框,代码定义一个结构实例化对象r2,然后把对象r1赋值给r2

    那它们输出的结果是多少呢?请选择(   )

   

A、  s1的值为:12     s2的值为222
       r1的值为:16     r2的值为666

B、  s1的值为:12     s2的值为222
       r1的值为:666    r2的值为666

C、  s1的值为:222    s2的值为222
       r1的值为:16     r2的值为666

D、  s1的值为:222     s2的值为222
       r1的值为:666     r2的值为666

正确答案是:C

为什么会这样呢?所以我们来看一看,多个值类型和引用类型在内存里面是如何存储的,如图:

C#基础(四)--值类型和引用类型,栈和堆的含义

从图中,可以看出,两个引用类型 s1,s2都指向了同一个拖管堆上的空间,

当某一个发生改变的时候,其于的会发生变化

而结构是值类型,虽然使用r2=r1,把r1对象赋值给r2,

但是它会在线程栈中分配一个独立的空间,

     当修改某一个对象的值的时候,不会影响到另一个对象

   所以,值类型和引用类型的区别就是:

            1、它们存储的位置不一样

            2、如果是引用类型,当两个对象指向同一个地方,修改某一个的时候,其它对象的值会发生改变

C#基础(四)--值类型和引用类型,栈和堆的含义的更多相关文章

  1. c#1所搭建的核心基础之值类型和引用类型

    这个主题很重要,在.NET中做的一切其实都是在和一个值类型或者引用类型打交道. 现实世界中的值和引用 假定你在读一份非常棒的东西,希望一个朋友也去读他.于是你到复印室里复印了一份.这个时候他获得了属于 ...

  2. C#面试基础知识点:值类型和引用类型(1)(填坑文)

    目录 前言 C#值类型和引用类型 基类(共同点) 值类型继承基类(不同点) 应用类型继承 技术经理的问题 值类型与引用类型都可以用Equals来比较吗? 如何将一个数组a的值赋予数组b然后对b做修改而 ...

  3. C#基础:值类型、引用类型与ref关键字

    在C#中,ref的意思是按引用传递.可以参考C++: int a = 10, b = 20; void swap(int x, int y) { int temp = x; x = y; y = te ...

  4. C# 托管与非托管类型 堆和栈 值类型与引用类型 装箱与拆箱

    一.托管类型与非托管类型 1.托管类型 托管类型包括 引用类型 以及 包含有引用类型或托管类型成员的结构. 引用类型 含引用类型或托管类型成员(字段.自动实现 get 访问器的属性)的结构 // 托管 ...

  5. C#基础知识系列二(值类型和引用类型、可空类型、堆和栈、装箱和拆箱)

    前言 之前对几个没什么理解,只是简单的用过可空类型,也是知道怎么用,至于为什么,还真不太清楚,通过整理本文章学到了很多知识,也许对于以后的各种代码优化都有好处. 本文的重点就是:值类型直接存储其值,引 ...

  6. 20151024_001_C#基础知识(静态与非静态的区别,值类型和引用类型,堆和栈的区别,字符串的不可变性,命名空间)

    1:我们把这些具有相同属性和相同方法的对象进行进一步的封装,抽象出来类这个概念. 类就是个模子,确定了对象应该具有的属性和方法. 对象是根据类创建出来的. 2:类:语法 [public] class ...

  7. 【Unity|C#】基础篇(2)——栈与堆、值类型与引用类型

    传送门:https://www.cnblogs.com/moonache/p/6008048.html [笔记] 图1:值类型与引用类型 存储方式 > 值类型:数据直接存在栈中 > 引用类 ...

  8. 【译】.NET中六个重要的概念:栈、堆、值类型、引用类型、装箱和拆箱

    为何要翻译 一来是为了感受国外优秀技术社区知名博主的高质量文章,二来是为了复习对.NET技术的基础拾遗达到温故知新的效果,最后也是为了锻炼一下自己的英文读写能力.因为是首次翻译英文文章(哎,原谅我这个 ...

  9. .NET中六个重要的概念:栈、堆、值类型、引用类型、装箱和拆箱 (转)

    作者: Edison Chou  来源: 博客园  发布时间: 2014-09-03 15:59  阅读: 318 次  推荐: 2   原文链接   [收藏]   原文作者:Shivprasad k ...

随机推荐

  1. iOS 设置状态栏的背景颜色

    设置状态栏的背景颜色 - (void)setStatusBarBackgroundColor:(UIColor *)color { UIView *statusBar = [[[UIApplicati ...

  2. 从oracle数据库中导出excel问题导致乱码的问题

    使用plsqldev工具将oracle的查询结果导出为excel,结果可以成功导出,但是使用libreoffice进行查看时,有好多记录都是空的. 使用python进行导出(openpyxl模块进行e ...

  3. E - 今年暑假不AC

      Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Des ...

  4. RX学习笔记:在FreeCodeCamp的学习

    FreeCodeCamp https://www.freecodecamp.com 2016-07-03 前几日在Github浏览时,偶然看到一个叫FreeCodeCamp的开源项目,进去该网站之后感 ...

  5. python中__init__.py文件的作用

    问题 在执行models.py时,报ImportError:No module named transwarp.db的错误,但明明transwarp下就有db.py文件,路径也没有错误.真是想不通.后 ...

  6. set -x /set +x(linux)

    Linux 脚本中生成日志 set -x Posted on 2012-07-25 09:44 紫冰龙 阅读(3946) 评论(0) 编辑 收藏 set -x 与 set +x 在liunx脚本中可用 ...

  7. HDU 1754 I Hate It(线段树之单点更新,区间最值)

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  8. java.util.concurrent.ExecutionException: com.android.builder.internal.aapt.v2.Aapt2Exception: AAPT2 error: check logs for details

    Caused by: java.util.concurrent.ExecutionException: com.android.builder.internal.aapt.v2.Aapt2Except ...

  9. ssh+key

    一.ssh概述 在进行数据传输之前,SSH先对联机数据包通过加密技术进行加密处理,加密后在进行数据传输.确保了传递的数据安全. lrzsz安装包传输本地与Linux SSH客户端(ssh命令)还包含一 ...

  10. [Java] 集合框架原理之一:基本结构与源码分析

    一.Collection Collection 接口定义了一些基本的方法: int size(); boolean isEmpty(); boolean add(E e); boolean addAl ...