C# .Net基础知识点解答 C# .Net基础知识点解答

C# .Net基础知识点解答

1. 什么是.NET?什么是CLI?什么是CLR?IL是什么?JIT是什么,它是如何工做的?GC是什么,简述一下GC的工做方式?javascript

通俗的讲,.Net是微软开发应用程序的一个平台;html

CLI是Common Language Infrastructure,是公共语言架构;java

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++程序中相似于内存泄露、访问不可达对象等问题。ide

一个对象若没有被其余任何对象引用,则该对象被认为是能够回收的对象;函数式编程

最好不要经过GC.Collect来强制执行垃圾回收;

垃圾对象并不是被当即执行内存清理,GC能够在任什么时候候执行垃圾收集。

 

2. 类(class)和结构(struct)的区别是什么?它们对性能有影响吗?.NET BCL里有哪些是类(结构),为何它们不是结构(类)?在自定义类型时,您如何选择是类仍是结构?

Class是引用类型,是非配在内存的托管堆上,可以被实例化,属于引用类型,类是引用传递的;

而struct是值类型,分配在内存的栈上,结构体是复制传递的,如Int3二、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关键字标记扩展方法的第一个参数,且该参数不能为指针类型。

相关文章
相关标签/搜索