首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

.NET基础面试题整理

值类型与引用类型 结构是值类型:值类型在栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,通过使用结构可以创建更多的值类型 类是引用类型:引用类型在堆上分配地址堆栈的执行效率要比堆的执行效率高...(object),c#中所有类型的基类型都是object 2.虽然结构的初始化也使用了New 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态...而堆则需要GC(Garbage collection:垃圾收集器)清理 07 7.什么情况下会在堆(栈)上分配数据?它们有性能上的区别吗?“结构”对象可能分配在堆上吗?...什么情况下会发生,有什么需要注意的吗? 1)值类型一般分配在对上面,引用类型分配在堆上面。栈的效率要高于堆。 2)可能,当在类中定义一个结构类型时,该结构就分配在堆上 08 8.泛型的作用是什么?...NET BCL中有哪些常见的异常?在代码中您是如何捕获/处理异常的? 在“catch (ex)”中,“throw”和“throw ex”有什么区别?您会如何设计异常的结构,什么情况下您会抛出异常?

1.6K21

.NET面试题解析(01)-值类型与引用类型

它们有性能上的区别吗? 6.“结构”对象可能分配在堆上吗?什么情况下会发生,有什么需要注意的吗? 7. 理解参数按值传递?以及按引用传递? 8. out 和 ref 的区别与相同点? 9....如果结构体中定义引用类型,对象在内存中是如何存储的?例如下面结构体中的class类 User对象是存储在栈上,还是堆上?...变量b在栈上存储,其值指向字符串“123”的托管堆对象地址(字符串是引用类型,字符串对象是存储在托管堆上面。字符串是一个特殊的引用类型,后面文章会专门探讨)” ? 值类型一直都存储在栈上面吗?...线程堆栈:简称栈 Stack 托管堆: 简称堆 Heap 值类型大多分配在栈上,引用类型都分配在堆上; 栈由操作系统管理,栈上的变量在其作用域完成后就被释放,效率较高,但空间有限。...什么情况下会发生,有什么需要注意的吗?

81420
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

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

    本文的重点就是:值类型直接存储其值,引用类型存储对值的引用,值类型存在堆栈上,引用类型存储在托管堆上,值类型转为引用类型叫做装箱,引用类型转为值类型叫拆箱。   ...值类型和引用类型在赋值(或者说复制)的时候也是有区别的。值类型数据在赋值的时候是直接复制值到新的对象中,而引用类型则只是复制对象的引用。 最后,值类型存在堆栈上,引用类型存储在托管堆上。...2、C#堆栈的工作方式   Windwos使用虚拟寻址系统,把程序可用的内存地址映射到硬件内存中的实际地址,其作用是32位处理器上的每个进程都可以使用4GB的内存-无论计算机上有多少硬盘空间(在64位处理器上...变量的生存期总是嵌套的,当d在作用域的时候,无论发生什么事情,都可以保证堆栈指针一直指向存储d的空间。删除这个d变量的时候堆栈指针递增8,现在指向d曾经使用过的空间,此处就是放置闭合花括号的地方。...在这个过程中会发生两次装箱操作和两次拆箱操作,在向ArrayList中添加int类型元素时会发生装箱,在使用foreach枚举ArrayList中的int类型元素时会发生拆箱操作,将object类型转换成

    1.2K41

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

    本文的重点就是:值类型直接存储其值,引用类型存储对值的引用,值类型存在堆栈上,引用类型存储在托管堆上,值类型转为引用类型叫做装箱,引用类型转为值类型叫拆箱。   ...值类型和引用类型在赋值(或者说复制)的时候也是有区别的。值类型数据在赋值的时候是直接复制值到新的对象中,而引用类型则只是复制对象的引用。 最后,值类型存在堆栈上,引用类型存储在托管堆上。...2、C#堆栈的工作方式   Windwos使用虚拟寻址系统,把程序可用的内存地址映射到硬件内存中的实际地址,其作用是32位处理器上的每个进程都可以使用4GB的内存-无论计算机上有多少硬盘空间(在64位处理器上...变量的生存期总是嵌套的,当d在作用域的时候,无论发生什么事情,都可以保证堆栈指针一直指向存储d的空间。删除这个d变量的时候堆栈指针递增8,现在指向d曾经使用过的空间,此处就是放置闭合花括号的地方。...在这个过程中会发生两次装箱操作和两次拆箱操作,在向ArrayList中添加int类型元素时会发生装箱,在使用foreach枚举ArrayList中的int类型元素时会发生拆箱操作,将object类型转换成

    1.1K10

    高频golang面试题:简单聊聊内存逃逸?

    问题 知道golang的内存逃逸吗?什么情况下会发生内存逃逸? 怎么答 golang程序变量会携带有一组校验数据,用来证明它的整个生命周期是否在运行时完全可知。...如果变量通过了这些校验,它就可以在栈上分配。否则就说它 逃逸 了,必须在堆上分配。 能引起变量逃逸到堆上的典型情况: 在方法内把局部变量指针返回 局部变量原本应该在栈中分配,在栈中回收。...在一个切片上存储指针或带指针的值。 一个典型的例子就是 []*string 。这会导致切片的内容逃逸。尽管其后面的数组可能是在栈上分配的,但其引用的值一定是在堆上。...slice 的背后数组被重新分配了,因为 append 时可能会超出其容量( cap )。 slice 初始化的地方在编译时是可以知道的,它最开始会在栈上分配。...想像一个 io.Reader 类型的变量 r , 调用 r.Read(b) 会使得 r 的值和切片b 的背后存储都逃逸掉,所以会在堆上分配。

    1.3K20

    堆栈与堆(Stack vs Heap):有什么区别?一组图片给你讲清楚!

    该变量也存储在堆栈内存中。x然后,我们以和作为参数调用 add 函数10。函数调用及其参数和返回地址都放置在堆栈中。一旦add函数返回,堆栈就会被弹出,删除函数调用和关联的数据,我们可以打印结果。...sum 第15行:result函数堆栈帧上的局部变量main被赋予返回值(即15)。 第 17 行:存储在变量中的值result(即 15)使用 打印到控制台std::cout。...这是通过使用驻留在堆栈内存中的指针或引用变量来完成的: int* ptr在C++中。 Java 中的一个Integer对象ptr。 ptrPython 中包含单个元素的列表。 然后打印存储在堆上的值。...栈段和堆段为空 1共 7 个 为主函数创建一个新的堆栈帧 2共 7 个 局部变量值被赋予值 42 3共 7 个 在堆上分配了一个指针变量ptr,指针ptr中存放的是分配的堆内存的地址(即0x1000)...第 5 行:堆栈帧上的局部变量value被赋值为42。 第 8 行:ptr使用关键字为堆上的单个整数动态创建的内存分配给指针变量new。我们假设堆上新内存的地址为 0x1000。

    2K10

    二进制利用之缓冲区溢出浅析

    栈溢出会损坏在栈上的内存。这意味着局部变量,函数参数和返回地址的值会受到影响。 而堆溢出是破坏位于堆上的内存的溢出。它的影响更大,全局变量和其他程序数据都会受到影响。...2.代码执行 在堆栈溢出攻击中,如果攻击者能够讲自己设计的代码植入内存中,则他可以覆盖堆栈上的返回地址,从而使其指向恶意代码的位置。...具体办法是在栈的返回地址的存储位置之前放置一个整形值,该值在装入程序时随机确定。栈缓冲区攻击时从低地址向高地址覆盖栈空间,因此会在覆盖返回地址之前就覆盖了警惕标志。...栈返回前会检查该警惕标志是否被篡改。 今天只是了解简单的概念即可,之后笔者在后续的文章中再深入它们。目前我们只需要知道栈的警惕标志是在返回地址之前放置在内存中的随机值。...在缓冲区溢出发生之前,金丝雀的值为随机值: 缓冲区溢出后,Canary值会更改: 此时,系统会检测到攻击,并且不会重定向到攻击者控制的地址。

    1.1K00

    大厂面试题整理(一):JVM

    jvm内存模型,内存屏障 对象一定分配在堆栈对象不一定分配在堆上,JIT可以实现栈上分配 java线程模型和jvm线程模型区分 Java堆的内存结构?在什么地方会发生OOM?如何分析OOM发生的原因?...让你自己实现OOM,你会怎么做? 什么东西分配在堆上和栈上? 一个对象从创建到销毁都是怎么在这些部分里存活和转移的?...CMS和G1各自使用的算法以及优缺点 内存分配策略(如何在Eden和老年代中分配)、回收策略(Minor GC、Full GC) 谈谈你对上面GC中回收对象中提出的对象有什么理解?...,cms是否会停顿,在什么时候停顿 讲讲 GC,清除,整理,交换(survivor 区域),CMS 执行的过程 什么情况会导致内存泄露,内存溢出,你怎么解决的。...Concurrent Model Failure和ParNew promotion failed什么情况下会发生?CMS的优缺点?有做过哪些GC调优?为什么要划分成年轻代和老年代?

    71860

    C#中谁最快:结构还是类?

    前言 在内存当道的日子里,无论什么时候都要考虑这些代码是否会影响程序性能呢? 在现在的世界里,几乎不会去考虑用了几百毫秒,可是在特别的场景了,往往这几百毫米确影响了整个项目的快慢。...为什么会出现这样的事情,这里发生了什么? 不同的在于结构和类如何存储在内存中。 下面是 PointClass 实例 内存布局: ? 该列表是一个局部变量,存放在堆栈中。...引用堆上的一组 PointClass实例 PointClass 是一个引用类型,存放在堆上。 该列表仅维护一个数组,指向存储在堆上 PointClass 实例。...观察到上图的黄色箭头,在堆上引用了很多实例。 数组是一组相同的对象,MeasureTestB 这个方法是将一组相同的对象存放在数组中。...我们来看看 PointStruct 的内存布局: ? 结构是值类型,所有 PointStruct 实例都存储在数组本身中。堆上只有一个对象。 初始化数组,.NET运行库可以将X和Y值直接写入数组里。

    41830

    安得倚天抽宝剑——Go中new到底在堆还是栈中分配

    安得倚天抽宝剑——Go中new到底在堆还是栈中分配 逃逸分析是什么? 在C/C++中,我们是使用malloc或new来从堆山取一块内存,怎么使用这块内存,完全取决于程序员,因此很容易发生内存泄漏。...而Go语言会在两个地方给变量分配内存,虽然Go也是可以通过new来给变量分配内存,但是分配的这块内存,可能在堆上,也可能在栈上。从性能的角度出发,在栈上分配内存和在堆上分配内存,性能差异是非常大的。...因此一个变量是在对上分配内存,还是在栈上分配内存,是需要编译器经过逃逸分析才能得出结论。 在编译原理中,分析指针动态范围的方法称为逃逸分析。...Golang的逃逸分析简单来说就是,如果一个变量的引用从声明它的函数中返出去了,则发生“逃逸”,因为它有可能在函数外被别的内容使用,所以必须分配到堆上。...如果变量在函数外部没有被引用,那么就优先将这个变量放置在栈上。

    34330

    『JVM』我不想知道我是怎么来滴,我就想知道我是怎么没滴

    我们都知道 Java 程序都是跑在 JVM 上的,一旦 JVM 有什么风吹草动,必然会影响服务的稳定性。幸运的话,服务会发生抖动,可能有部分请求出现延迟或异常。...那什么情况下会造成 JVM 崩溃呢,有哪几种类型的崩溃呢?俗话说,知己知彼,方能百战不殆。了解了发生崩溃的原因,才能更好的解决 JVM 崩溃问题。...JVM 中分配绝大多数对象实例和数组都存在堆上,另外堆内存也是垃圾收集器工作的主要战场。...当我们的 Java 程序启动的时候,会指定堆空间的大小,新建对象和数组的时候会分配到堆上面,当新对象申请空间的时候,如果堆内存不够了,就会发生垃圾收集动作,大多数时候会发生在新生代,叫做 Minor GC...List数组中每次添加500k的元素,整个堆只有20M,可想而知,程序一运行起来,马上就会将对空间填满,导致后面的元素加不进去,而又回收不掉,从而导致堆内存溢出。

    65510

    在基础语法中Java与c++有哪些不同?(对于学过c++转Java必看)

    会根据不同的处理器选择最为高效的整形,会导致某个c程序在32位处理器上运行的好好的,然后在16位处理器上出现问题,范围在c和c++中,int和long等类型的大小与目标平台有关,例如,long在32位上是...4字节,在64位上则为8字节,注意:Java中没有然后无符号形式的int,long,short,byte类型 boolean类型 boolean类型在Java中只有俩个固定值:false和true,整形与布尔型不能进行相互转换...,基本与c++类似,值得注意的是c++中的字符串可以修改,可以修改字符串中的单个字符 比较方面: 对于Java没有重载==号,这个运算符只能确定俩个字符串是否存放在同一个位置,但是有可能将内容相同的字符串副本放置在不同的位置上...("%.2f",x);//保留2位小数 数组 Java数组与堆栈上的c++数组有很大的不同,但基本上与在堆上分配的数组指针一样 即是 int[] a = new int[100];//java不同于int...a[100];//C++而等同于int* a = new int[100];//C++ 也导致了Java中的【】运算符被预定义为会完成越级检查,而且没有指针运算,不能通过a+1来得到数组中的下一个元素

    84520

    Golang内存逃逸是什么?怎么避免内存逃逸?

    逃逸分析是怎么完成的 Go逃逸分析最基本的原则是:如果一个函数返回对一个变量的引用,那么它就会发生逃逸。 任何时候,一个值被分享到函数栈帧范围之外,它都会在堆上被重新分配。...简单来说,编译器会分析代码的特征和代码生命周期,Go中的变量只有在编译器可以证明在函数返回后不会再被引用的,才分配到栈上,其他情况下都是分配到堆上。...简单来说,编译器会根据变量是否被外部引用来决定是否逃逸: 如果函数外部没有引用,则优先放到栈中; 如果函数外部存在引用,则必定放到堆中; 逃逸的常见情况 发送指针的指针或值包含了指针到 channel...slices 中的值是指针的指针或包含指针字段。一个例子是类似[] *string 的类型。这总是导致 slice 的逃逸。即使切片的底层存储数组仍可能位于堆栈上,数据的引用也会转移到堆中。...,但是其大小不能够在在编译时候确定的情况,也会分配到堆上 逃逸如何避免 go 中的接口类型的方法调用是动态调度,因此不能够在编译阶段确定,所有类型结构转换成接口的过程会涉及到内存逃逸的情况发生。

    5.9K12

    面试官不讲武德,居然让我讲讲蠕虫和金丝雀!

    在函数fun中,fun函数根据传入的参数i来初始化a数组。显然,i的值只能为0和1。在fun函数中,同时还设置了d的值为3.14。当我们给fun函数传入0和1时可以打印出正确的结果3.14。...但是当我们传入2,3,6时,奇怪的现象发生了。为什么fun(2)和fun(3)的值会接近3.14,而fun(6)会报错呢?   ...a数组占用8个字节,d变量占用8字节,d排布在a数组的上方。所以我们会看到,如果我引用 a[0] 或者 a[1],会按照正常修改该数组的值。...如果两个数相同,xorq指令就会得到0,函数会按照正常的方式完成。非零的值表明栈上的金丝雀值被修改过,那么代码就会调用一个错误处理例程。   栈保护很好地防止了缓冲区溢出攻击破坏存储在程序栈上的状态。...在数组中,我们可以将数组的索引声明为size_t类型,从根本上防止它传递负数。此外,还可以在访问数组前来加上num小于ARRAY_MAX 语句来检查数组的上界。

    1.2K10

    Rust 编程学习笔记Day 3-变量所有权及生命周期

    先看下变量在函数调用时发生了什么? 这段代码,在main函数里 初始化了一个动态数组data和 一个整形值 v....,在编译期无法确定大小,所以实际上是在堆上申请的内存,在栈上有一个包含长度和容量的指针指向堆上的内存。...(类似golang的slice,会内存逃逸到堆上) 调用find_pos的时候 data 和 v 作为参数传递,放在 find_pos 的参数区。...原先main函数中的data,在调用find_pos()后,就失效了,编译器会保证main函数后的代码无法访问data这个变量,这样就确保了堆上的内存有且只有一个引用。...那怎么才能 在sum()后面使用data1呢?我现在知道的方式有2种: 可以在传到sum()时候的 clone()一下。这里会把data1的数据复制一份出来。这样在堆上就有2个互不影响的内存。

    57140

    在 C# 中使用 Span 和 Memory 编写高性能代码

    与在 GC 堆上分配内存的数组类型不同,这些新类型提供了对任意托管或本机内存的连续区域的抽象,而不需要在 GC 堆上分配内存。 译者注:因为它们都是 struct,会被分配到栈中。...Span 能够指向分配给堆栈或堆上的内存块。但是,因为 Span 被定义为 ref 结构,所以它应该只驻留在堆栈上。...Span 的使用方式与数组相同,但是与数组不同,它可以引用堆栈内存,即堆栈上分配的内存、托管内存和本机内存。这为开发者提供了一种简单的方法来利用以前只有在处理非托管代码时才能获得的性能改进。...如果开发者的数据已经在堆栈上,则不需要这样做,但是对于大型对象,这样做很有用,因为以这种方式分配的数组只有在其作用域持续存在时才存在。...数组表示连续的内存缓冲区。 例如: int[] values = new int[5]; 上面示例中的五个整数将从第一个元素(值[0])开始,按顺序放置在内存中的五个位置。

    3.1K10

    单片机STM32的启动文件详解--学习笔记

    初始化用户堆栈,从而最终调用main 函数去到C 的世界   查找ARM 汇编指令   在讲解启动代码的时候,会涉及到ARM 的汇编指令和Cortex 内核的指令,剩下的ARM的汇编指令我们可以在MDK...堆主要用来动态内存的分配,像malloc()函数申请的内存就在堆上面。这个在STM32里面用的比较少。   ...为了决定 ESR的入口地址, 内核使用了―向量表查表机制‖。这里使用一张向量表。向量表其实是一个WORD( 32 位整数)数组,每个下标对应一种异常,该下标元素的值则是该 ESR 的入口地址。...向量表在地址空间中的位置是可以设置的,通过 NVIC 中的一个重定位寄存器来指出向量表的地址。在复位后,该寄存器的值为 0。...从代码上看,向量表中存放的都是中断服务函数的函数名,可我们知道C 语言中的函数名就是一个地址。   DCD:分配一个或者多个以字为单位的内存,以四字节对齐,并要求初始化这些内存。

    1.4K40

    Golang之变量去哪儿

    这些局部变量是在栈上分配的(静态内存分配),一旦函数执行完毕,变量占据的内存会被销毁,任何对这个返回值作的动作(如解引用),都将扰乱程序的运行,甚至导致程序直接崩溃。...调用者可能会忘记delete或者直接拿返回值传给其他函数,之后就再也不能delete它了,也就是发生了内存泄露。关于这个坑,大家可以去看看《Effective C++》条款21,讲得非常好!...通过逃逸分析,可以尽量把那些不需要分配到堆上的变量直接分配到栈上,堆上的变量少了,会减轻分配堆内存的开销,同时也会减少gc的压力,提高程序的运行速度。...简单来说,编译器会分析代码的特征和代码生命周期,Go中的变量只有在编译器可以证明在函数返回后不会再被引用的,才分配到栈上,其他情况下都是分配到堆上。...简单来说,编译器会根据变量是否被外部引用来决定是否逃逸: 如果函数外部没有引用,则优先放到栈中; 如果函数外部存在引用,则必定放到堆中; 针对第一条,可能放到堆上的情形:定义了一个很大的数组,需要申请的内存过大

    76720

    Golang之变量去哪儿

    这些局部变量是在栈上分配的(静态内存分配),一旦函数执行完毕,变量占据的内存会被销毁,任何对这个返回值作的动作(如解引用),都将扰乱程序的运行,甚至导致程序直接崩溃。...调用者可能会忘记delete或者直接拿返回值传给其他函数,之后就再也不能delete它了,也就是发生了内存泄露。关于这个坑,大家可以去看看《Effective C++》条款21,讲得非常好!...通过逃逸分析,可以尽量把那些不需要分配到堆上的变量直接分配到栈上,堆上的变量少了,会减轻分配堆内存的开销,同时也会减少gc的压力,提高程序的运行速度。...简单来说,编译器会分析代码的特征和代码生命周期,Go中的变量只有在编译器可以证明在函数返回后不会再被引用的,才分配到栈上,其他情况下都是分配到堆上。...简单来说,编译器会根据变量是否被外部引用来决定是否逃逸: 如果函数外部没有引用,则优先放到栈中; 如果函数外部存在引用,则必定放到堆中; 针对第一条,可能放到堆上的情形:定义了一个很大的数组,需要申请的内存过大

    52620

    .NET基础拾遗(1)类型语法基础和内存管理基础

    (2)内存分配的区别 引用类型的对象将会在堆上分配内存,而值类型的对象则会在堆栈上分配内存。堆栈空间相对有限,但是运行效率却比堆高很多。   ...(1)装箱:CLR需要做额外的工作把堆栈上的值类型移动到堆上,这个操作就被称为装箱。   (2)拆箱:装箱操作的反操作,把堆中的对象复制到堆栈中,并且返回其值。 ?   ...首先,struct(结构)是值类型,而class(类)是引用类型,所有的结构对象都分配在堆栈上,而所有的类对象都分配在堆上。   ...大家都知道,.NET的类型分为引用类型和值类型,当一个方法参数是引用类型时,传递的本质就是对象的引用。所以,这两个关键字的作用都发生在值类型上。   ...(1).NET中的堆栈   堆栈用来存储值类型的对象和引用类型对象的引用(地址),其分配的是一块连续的地址,如下图所示,在.NET应用程序中,堆栈上的地址从高位向低位分配内存,.NET只需要保存一个指针指向下一个未分配内存的内存地址即可

    66020
    领券