.net面试题1

1. 装箱拆箱
(1). 什么是装箱,什么是拆箱?
(2). 请用文字或者图,描述出装箱和拆箱在内存中的动作(stack/heap).
(3). 如果同时执行装箱和拆箱动作各10W次,是装箱的性能好,还是拆箱的性能更好?并且请说出为什么.

答案:http://www.cnblogs.com/zhangkai2237/archive/2013/03/21/2974570.html
2. 值类型与引用类型
(1).字符串是值类型还是引用类型?
(2).为什么说.NET中的字符串很特殊?
(3).值类型分配在哪里? 直接将内存存储在栈内,由系统自动释放资源的数据类型

(4).引用类型分配在哪里?堆
(5).值类型和引用类型分配的地方是固定不变的吗?如果不是,请说明原因.

将一个值类型变量装箱成一个引用类型变量,首先会在托管堆上为新的引用类型变量分配内存空间,然后将值类型变量拷贝到托管堆上新分配的对象内存中,最后返回新分配的对象内存地址。装箱操作是可逆的,所以还有拆箱操作。拆箱操作获取指向对象中包含值类型部分的指针,然后由程序员手动将其对应的值拷贝给值类型变量。

直白点儿说:值类型就是现金,要用直接用;引用类型是存折,要用还得先去银行取现。

堆栈是两种数据结构
(6).请说出下列哪些是值类型哪些是引用类型:

Guid,DateTime, TimeSpan, struct
3. 线程与锁
(1) .NET中一共分为几种锁类型?

http://www.cnblogs.com/chillsrc/archive/2013/04/13/3018386.html
(2) Lock关键字在.NET FRAMEWORK中对应了哪个类?system

https://msdn.microsoft.com/zh-cn/library/aa288472(v=vs.71).aspx
(3) 众所周知,lock关键字只是个语法糖, 请写出lock关键字展开后的C#代码.
(4) .NET中Lock的内部实现一共分为几个版本?
(5) .NET 4.0 对于Lock内部的实现做出了哪些修改? 这样的修改是为了解决什么问题?
(6) .NET中Lock的内部实现是属于哪种锁的分类?如果可以,请描述出lock的内部实现.
(7) 你知道.NET类库中一共有多少个锁吗? 可否说出来几个.
(8) 你常用的锁是哪些?lock和Monitor

http://www.cnblogs.com/goody9807/archive/2010/06/17/1759645.html
(9) Interlocked是个什么类型的锁?

Interlocked 类提供了同步对多个线程共享的变量的访问的方法。如果该变量位于共享内存中,则不同进程的线程就可以使用该机制。互锁操作是原子的,即整个操作是不能由相 同变量上的另一个互锁操作所中断的单元。这在抢先多线程操作系统中是很重要的,在这样的操作系统中,线程可以在从某个内存地址加载值之后但是在有机会更改 和存储该值之前被挂起

(10)你觉得,使用Interlocked可以提高程序的性能吗?
(11)你知道Interlocked是如何在多线程的情况下保证资源同步的吗?
(12).NET线程池中一共分为几种类型的线程?
(13).NET线程默认的用户态栈大小是多少?

栈和线程相关, 默认1MB预留, 初次递交8KB, 自动增长, 具体使用要看线程调用栈了. 所以如果进程中有N个线程默认情况下, 有N*1MB栈预留空间, 和小于这个数字实际使用.

堆和Heap管理有关, 默认存在系统堆和CRT堆. 具体大小取决于程序本身对内存分配和使用, 可以调用HeapSize看实际使用大小. 

另外还有虚拟内存, 独立于对堆外, 直接通过VirtualAlloc预留或分配. 也属于进程动分配内存.


(14)你觉得在.NET中,线程是一种很昂贵的资源吗? 请写出你的看法.
(15)当对一个委托进行异步操作的时候,触发回调函数的线程是.NET线程池中的线程吗?如果是,请说出,触发的线程属于.NET线程池中的哪一类线程.
(16)你经常会在什么情况下使用多线程? 为什么说使用多线程能提高程序性能?
(17)线程在.NET当中对应的类名是什么?
(18)在多线程的场景下,为什么说线程上下文会带来额外的性能开销?
(19)有什么方法可以在要求高性能的情况下减少这种线程上下文所带来的额外成本吗?
(20)请描述出线程死锁的经典场景,并且给予避免死锁的解决方案.
4. GC与内存
(1). 请描述出GC的作用
(2). GC一共分为几个代龄? 请分别描述一下这几代.
(3). 请描述出GC回收时候的步骤,越详细越好.
(4). LOH是什么?
(5). 请描述一下LOH.
(6). 在什么情况下,.NET中的对象会存储在LOH中?
(7). 请描述一下LOH的回收过程,另外,LOH的回收会触发Compress步骤吗? 如果会,请说出原因,如果不会,请说出理由。
(8). 请说出GC的回收,一般会在什么时候进行触发?
(9). 在程序初始化的时候,.NET一共为这几个GC代龄分配了几个MemorySegment?这些Segment会增加吗? 如果会,请写出在什么情况下,.NET GC会增加自身的Memory Segment.
(10). 什么情况下,程序的内存会出现大量的内存碎片? 内存碎片在GC的第几代时才是最致命的?我们如何尽可能的规避这个问题?
(11). 什么情况下.NET的程序会出现内存泄露? 为什么会出现内存泄漏的情况? 请举出几个经典的场景来说明一下,并且阐述一下你对于此问题的解决方案.
5. 调试
(1). 请描述出你一般使用的.NET调试工具
(2). VS IDE是非常权威的工具,那么请问,你都使用过这个IDE的哪些调试功能?
(3). 在下断点的时候,断点一共分为几种? 你经常会使用哪一种的断点来协助调试你的程序?
(4). 假设你的程序正在运行于生产环境之上,任意时间过后,发现该程序使用的内存正在不断地上涨,在以后的任意时间内,随着上涨的趋势,程序就会崩溃,请问,你该如何面对此问题?
(5). 假设你的程序正在运行于生产环境之上,任意时间过后,发现该程序的CPU使用率突然飙升到很高的一个值,在以后的任意时间内,随着这种情况将可能会影响到当前系统中的其余程序,请问,你该如何面对此问题?
(6). 请给出WINDBG中查询内存中某个具体类型的命令.
6. TCP网络编程
(1). 请写出.NET FRAMEWORK 2.0关于Socket接收数据的APM示例代码.
(2). 请写出.NET FRAMEWORK 4.0关于Socket接收数据的APM示例代码.
(3). 这2种APM,哪种更好? 为什么? .NET 4.0的新APM是为了解决什么问题?
(4).SocketAsyncEventArgs在高性能的场景下,频繁的实例化此类会造成什么问题? 请说出这样做的缺点,并且给出一定的解决方案.

原文地址:https://www.cnblogs.com/Zive/p/4318321.html