zoukankan      html  css  js  c++  java
  • C#堆栈

    栈就是堆栈,因为堆和堆栈这样说太拗口了,搞得像绕口令,所以有些时候就把堆栈简称为栈。堆和栈,你看这又多舒服。

    但无论什么时候,堆栈都不等于堆和栈,必须说,堆和栈或者堆和堆栈。



    有人说:“C#的所有值类型与对象的引用是保存在栈中的,而所有的对象实例是保存在堆中的。”正确吗?

    不完全正确。

    应该说值类型变量和引用类型变量是保存在栈里面的。而值类型变量保存值类型实例的值,引用类型变量保存引用类型实例的引用。



    平时一个对象本身就包含有值类型和对象的实例,它们又是如何保存的?

    这个就要分清楚字段和变量的概念了。

    一般来说可以这样讲,在类里面声明的,是字段,在方法里面声明的,是变量。
    字段有访问修饰符(public/private/protected/internal),变量没有。

    字段和变量虽然用起来差不多,但实际上有很大的区别。

    变量永远是储存在栈里面的。

    字段跟随类的实例走。

    如:
    class ClassA
    {
      int i;//字段
    }

    Class a = new ClassA();
    Class b = new ClassA();

    现在其实有了两个i,a.i和b.i。

    要储存一个类的实例,实际上只要把这个类所有的字段存下来就够了。所以说类的实例存在哪里,字段就存在了哪里。

    对于值类型的类,类的实例储存在变量里面,也就是类的实例跟随变量储存在栈上。
    对于引用类型的类,类的实例储存在托管堆上。


    struct StructA
    {
      int i;
    }

    StructA a = new StructA();
    这个时候,a这个变量保存了StructA这个类的一个实例,也就是保存了他所有的字段。

    StructA b = a;
    这个时候出现了两个StructA实例,分别保存在a和b内,StructA的所有字段会被拷贝一份,也就是说现在已经有了两个i,a.i和b.i



    你自己可以推一下class的情况,看看是不是真的理解了。

    来源仅供学习: http://bbs.csdn.net/topics/90039021 

  • 相关阅读:
    处理emacs-org模式TODO的一个脚本
    MYSQL 数据类型
    Redis命令学习-Transaction(事务)
    成都青羊考场科目二考试分享
    地图入门_坐标系统
    microsoft SQL server,错误2
    搭建个人博客 方式2 使用jekyll
    WIN10 10招
    java正則表達式总结
    图解hdu5301Buildings
  • 原文地址:https://www.cnblogs.com/izhiniao/p/4325172.html
Copyright © 2011-2022 走看看