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关键字标记扩展方法的第一个参数,且该参数不能为指针类型。
C# .Net基础知识点解答的更多相关文章
- fastclick 源码注解及一些基础知识点
在移动端,网页上的点击穿透问题导致了非常糟糕的用户体验.那么该如何解决这个问题呢? 问题产生的原因 移动端浏览器的点击事件存在300ms的延迟执行,这个延迟是由于移动端需要通过在这个时间段用户是否两次 ...
- .NET基础知识点
.NET基础知识点 l .Net平台 .Net FrameWork框架 l .Net FrameWork框架提供了一个稳定的运行环境,:来保障我们.Net平台正常的运转 l 两种交 ...
- JavaScript 开发者经常忽略或误用的七个基础知识点(转)
JavaScript 本身可以算是一门简单的语言,但我们也不断用智慧和灵活的模式来改进它.昨天我们将这些模式应用到了 JavaScript 框架中,今天这些框架又驱动了我们的 Web 应用程序.很多新 ...
- JavaScript 开发者经常忽略或误用的七个基础知识点
JavaScript 本身可以算是一门简单的语言,但我们也不断用智慧和灵活的模式来改进它.昨天我们将这些模式应用到了 JavaScript 框架中,今天这些框架又驱动了我们的 Web 应用程序.很多新 ...
- JavaScript开发者常忽略或误用的七个基础知识点
JavaScript 本身可以算是一门简单的语言,但我们也不断用智慧和灵活的模式来改进它.昨天我们将这些模式应用到了 JavaScript 框架中,今天这些框架又驱动了我们的 Web 应用程序.很多新 ...
- JavaScript语言基础知识点图示(转)
一位牛人归纳的JavaScript 语言基础知识点图示. 1.JavaScript 数据类型 2.JavaScript 变量 3.Javascript 运算符 4.JavaScript 数组 5.Ja ...
- JavaScript 语言基础知识点总结
网上找到的一份JavaScript 语言基础知识点总结,还不错,挺全面的. (来自:http://t.cn/zjbXMmi @刘巍峰 分享 )
- c语言学习之基础知识点介绍(三):scanf函数
本节继续介绍c语言的基础知识点. scanf函数:用来接收用户输入的数据. 语法:scanf("格式化控制符",地址列表); 取地址要用到取地址符:&(shift+7) 例 ...
- c语言学习之基础知识点介绍(二):格式化控制符和变量的补充
上节简单介绍了c语言中的一些基础知识点,本节将对之前介绍的不够详细的知识点进行补充. 格式化控制符的消息介绍: %d的其他控制符: 1.%md:m代表这个整数位占用多少位,m是一个整数.实际数字不足的 ...
随机推荐
- mapreduce 多路输出
Streaming支持多路输出(SuffixMultipleTextOutputFormat) 如下示例: hadoop streaming \ -input /home/mr/data/test_t ...
- [转载]MongoDB学习 (四):创建、读取、更新、删除(CRUD)快速入门
本文介绍数据库的4个基本操作:创建.读取.更新和删除(CRUD). 接下来的数据库操作演示,我们使用MongoDB自带简洁但功能强大的JavaScript shell,MongoDB shell是一个 ...
- Python/Numpy大数据编程经验
Python/Numpy大数据编程经验 1.边处理边保存数据,不要处理完了一次性保存.不然程序跑了几小时甚至几天后挂了,就啥也没有了.即使部分结果不能实用,也可以分析程序流程的问题或者数据的特点. ...
- 物理地址为20位 如10000H 用段地址*16+偏移地址表示
段地质在cpu中,为16位 段地质*16则变成物理首地址20位,这个物理首地址必定是16的倍数. 偏移地址16位, 则表明一个段的大小为64k. 同时也表明16位地址的寻址能力为64kb
- HDOJ多校联合第五场
1001 Inversion 题意:求逆序对,然后交换k次相邻的两个数,使得剩下的逆序对最少. 分析:题目用到的结论是:数组中存在一对逆序对,那么可以通过交换相邻两个数使得逆序对减少1,交换k次,可以 ...
- [codility]Prefix-set
这题很简单,一开始用了set.但后来一想这样其实是n*logn的,而且没有利用所有的数都在0..N-1之间.那么可以直接用vector当hashset. // you can also use inc ...
- CPU Benchmarks
http://www.cpubenchmark.net/high_end_cpus.html 非常清楚~~~
- Spring事务传播特性的浅析——事务方法嵌套调用的迷茫
Spring事务传播机制回顾 Spring事务一个被讹传很广说法是:一个事务方法不应该调用另一个事务方法,否则将产生两个事务.结果造成开发人员在设计事务方法时束手束脚,生怕一不小心就踩到地雷. 其实这 ...
- leetcode面试准备:Kth Largest Element in an Array
leetcode面试准备:Kth Largest Element in an Array 1 题目 Find the kth largest element in an unsorted array. ...
- 被IDEA的打包功能打败了:dubbo服务端打包注意事项
下午在搭建一个基于dubbo和spring的服务端项目.结果打包成jar后各种报错. 起初是因为idea的机制,导致META-INF下自己的Mainfest.mf总是莫名被覆盖,于是报找不到主函数.后 ...