• C# 值类型 引用类型 线程栈 托管堆 的学习小记


    这几天在重温这部分基础知识,发现对这些概念只是停留在肤浅的表面,有很大的误解,在这里记下一些重点,随时更新

    以前未深入了解时存在的一些误解:

    1.值类型是存在于栈中,引用类型存在于堆中。(这句话在一些面试题中经常看到,但是这是错的:引用类型中声明的值类型变量,存于堆中)

    2. C#程序入口就是program类,更甚的是桌面程序进去的所有窗体也是引用类型,那几乎所有对象都存在于堆中,则可以推断栈则很少用到,没什么用处。(错:方法中声明的值类型及引用类型变量都分配在线程栈,只是引用类型变量的值是指向分配在托管堆中实例对象的指针)

    3.引用类型的对象作为参数传入方法后,重新对实参赋值,则该参数引用的对象也会改变。(错:虽然两个引用类型的变量引用同一个实例对象,但不代表改变A变量的指向会影响B变量的指向)

    以下是一些知识点:

    1.引用类型总是分配于托管堆上,无论是类型对象还是类型实例对象。但表示(或称为“引用”)类型实例对象的变量,可能存在于栈中

    2.方法中声明的值类型,总是分配在线程栈中,方法中声明的引用类型,其变量分配在线程栈,实例对象分配在托管堆

    3. .net 的参数传递总是默认按值传递,无论是值类型参数还是引用类型参数,并且传入方法的参数会在方法内部生成相应的副本(值类型复制具体的值,引用类型复制实例对象在托管堆中的地址)

    4.引用对象的实例方法(即非静态方法)进入执行栈的时候,总会将当前对象(this)作为第一个参数传入方法,然后才是其他参数(如果有),并且实例方法只会被JIT编译一次

    这是这几天的一点收获,以后有想到的还会更新。如果有错误,敬请指出。

  • 相关阅读:
    JVM垃圾回收器(三)
    JVM 运行时数据区(二)
    JVM 虚拟机&&类加载(一)
    带你看看Java的锁(三)-CountDownLatch和CyclicBarrier
    带你看看Java的锁(二)-Semaphore
    带你看看Java的锁(一)-ReentrantLock
    C# 判断文件格式的一些总结
    qt creator源码全方面分析(4-6)
    c/c++调用matlab的matOpen()出现异常
    qt creator源码全方面分析(4-5)
  • 原文地址:https://www.cnblogs.com/xyz0835/p/3364428.html
Copyright © 2020-2023  润新知