C#.Net基础知识点解答
1. 什么是.NET?什么是CLI?什么是CLR?IL是什么?JIT是什么,它是如何⼯作的?GC是什么,简述⼀下GC的⼯作⽅式?
通俗的讲,.Net是微软开发应⽤程序的⼀个平台;
CLI是Common Language Infrastructure,是公共语⾔架构;
CLR是Common Language Runtime,即公共语⾔运⾏时;
IL是.Net编译器产⽣的中间代码,称为通⽤中间语⾔CIL(Common Intermediate Language),CIL常被称为MSIL,即代表IL的微实现语⾔;
JIT是以即时编译Just In Time的⽅式编译IL代码,和Java的字节码ByteCode对⽐来说,字节码是解释性编译,⽽JIT是即时编译,效率上会更胜⼀筹。
除此之外,还有CTS 通⽤类型系统,Common Type System;CLS公共语⾔规范Common Language Specification;FCL .Net框架类库Framework Class Library;
引⽤《你必须知道的.Net》⼀书中的插图做说明
GC,垃圾回收器,Garbage Collection,负责执⾏内存的清理⼯作,GC通过对托管堆的管理,能有效的解决C++程序中类似于内存泄露、访问不可达对象等问题。
⼀个对象若没有被其他任何对象引⽤,则该对象被认为是可以回收的对象;
最好不要通过GC.Collect来强制执⾏垃圾回收;
垃圾对象并⾮被⽴即执⾏内存清理,GC可以在任何时候执⾏垃圾收集。
2. 类(class)和结构(struct)的区别是什么?它们对性能有影响吗?.NET BCL⾥有哪些是类(结构),为什么它们不是结构(类)?在⾃定义类型时,您如何选择是类还是结构?
Class是引⽤类型,是⾮配在内存的托管堆上,能够被实例化,属于引⽤类型,类是引⽤传递的;
⽽struct是值类型,分配在内存的栈上,结构体是复制传递的,如Int32、Boolean、DateTime都是结构体。
频繁⼤量使⽤引⽤类型需要GC回收处理,在某些情况下对性能会有影响。字符串是什么类型的
如果⼀个对象只有属性、没有⽅法的时候应该定义成struc,开销会⼩⼀些;class适⽤于这个对象同时具有⾏为和属性。
3. 在.NET程序运⾏过程中,什么是堆,什么是栈?什么情况下会在堆(栈)上分配数据?它们有性能上的区别吗?"结构"对象可能分配在堆上吗?什么情况下会发⽣,有什么需要注意的吗?
栈是编译期间就分配好的内存空间,因此代码中必须就栈的⼤⼩有明确的定义,如局部类型变量、值类型参数等;
堆是程序运⾏期间动态分配的内存空间,可以根据程序的运⾏情况确定要分配的堆内存的⼤⼩。
性能上栈要⽐内存堆的开销⼩⼀些,速度快;
会,当⼀个类⾥⾯包含结构体对象的时候,struct会分配在堆上,值类型总是分配在它声明的地⽅。
4. 泛型的作⽤是什么?它有什么优势?它对性能有影响吗?它在执⾏时的⾏为是什么?.NET BCL中有哪些泛型类型?举例说明平时编程中您定义的泛型类型。
泛型类似于模板,有利于代码重⽤;
省去了拆箱、装箱过程,性能上提升了很多;
本质上来讲,在IL初次编译时泛型T只是作为类型占位符;
BCL中实现了泛型接⼝的类都是反省类型,如List<T>, Dictionary<T,K>
5. 异常的作⽤是什么?.NET BCL中有哪些常见的异常?在代码中您是如何捕获/处理异常的?在"catch (ex)"中,"throw"和"throw ex"有什么区别?您会如何设计异常的结构,什么情况下您会抛出异常?
异常是系统容错和规范程序的不可或缺的重要因素和⼿段。
BCL中常见的异常有StackOverflowException、OutOfMemoryException、NullReferenceException、IndexOutOfRangeException、ArgumentException、DivideByZeroException等;
捕获异常使⽤try-catch-finally语句块;
"throw"和"throw ex"的区别是:推荐使⽤throw来抛出异常,因为throw ex会将上次异常清空,⼜抛出⼀个新的异常,不利于堆栈跟踪错误源头。
6. List<T>和T[]的区别是什么,平时你如何进⾏选择?Dictionary<TKey, TValue>是做什么的?.NET BCL中还有哪些常⽤的容器?它们分别是如何实现的(哪种数据结构)?分别是适⽤于哪些场景?
List<T>长度不固定,动态变化,⽀持⽅法较多;T[]固定⼤⼩的泛型数组。
Dictionary<TKey, TValue>是泛型字典,提供⼀对⼀的关系;
.Net BCL中常⽤的集合有Stack<T>、Queue<T>、LinkedList<T>,对应的数据结构是栈、队列和链表。
7. 抽象类和接⼝有什么区别?使⽤时有什么需要注意的吗?如何选择是定义⼀个"完全抽象"的抽象类,还是接⼝?什么是接⼝的"显式实现"?为什么说它很重要?
相同点:都不能被实例化,都可以通过继承实现其抽象⽅法;
不同点:接⼝⽀持多继承,抽象类不能;接⼝只能定义⾏为,抽象类既可以定义⾏为,还能提供实现;接⼝只包含⽅法、属性、索引器和事件的签名,不能包括⾃定义字段和实现⽅法,抽象类可以包含⾃定义字段和实现⽅法。
8. 字符串是引⽤类型类型还是结构类型?它和普通的引⽤类型相⽐有什么特别的地⽅吗?使⽤字符串时有什么需要注意的地⽅?为什么说StringBuilder⽐较⾼效?在连接多个字符串时,它⽆论何时都⽐直接相加更⾼效吗?
字符串是特殊的引⽤类型。
其特殊之处在于string是不可变的,即字符串恒定性(Immutability),字符串⼀经创建,就不可改变。
当⼤量使⽤string进⾏拼接的时候,直接使⽤string+会影响效率,使⽤StringBuilder更为合适;
不是的,对于简单的字符串连接操作,在性能上StringBuilder不⼀定总是优于String,因为StringBuilder对象的创建代价⽐较⼤,在字符串连接⽬标较少的情况下,过度滥⽤StringBuilder会导致性能的浪费⽽⾮节约。只有⼤量的或者⽆法预知次数的字符串操作,才考虑以StringBuilder实现。
9. 如何⾼效地进⾏数组复制?"⼆维数组"和"数组的数组"有什么区别?在使⽤双重循环遍历⼀个⼆维数组时,如何选择内外层的遍历顺序?
10. 什么是元编程,.NET有哪些元编程的⼿段和场景?什么是反射?能否举⼀些反射的常⽤场景?有⼈说反射性能较差,您怎么看待这个问题?有什么办法可以提⾼反射的性能吗?
元编程是对程序本⾝的编程,如反射;
程序集包含模块,模块⼜包含类型,类型下有成员,反射就是管理程序集、模块、类型的对象,它能够动态的创建类,获取现有对象的类型,能调⽤类型的⽅法和访问类型的字段属性。它是在程序运⾏时创建和使⽤类型的。
11. 委托是什么?匿名⽅法是什么?在C# 3.0中,Lambda表达式是什么?扩展⽅法是什么?LINQ是什么?您觉得C# 3.0中还有哪些重要的特性,它们带来了什么优势?BCL中哪些类库和这些特性有关?您平时最常⽤哪些?
委托是指向函数的指针;匿名⽅法类似javascript中的匿名⽅法,⽆须声明,直接使⽤;
Lambda表达式函数式编程,LINQ表⽰语⾔集成查询,为CLR提供了信息查询能⼒。
扩展⽅法,⽤this关键字标记扩展⽅法的第⼀个参数,且该参数不能为指针类型。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。