原文地址

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基础知识点解答的更多相关文章

  1. fastclick 源码注解及一些基础知识点

    在移动端,网页上的点击穿透问题导致了非常糟糕的用户体验.那么该如何解决这个问题呢? 问题产生的原因 移动端浏览器的点击事件存在300ms的延迟执行,这个延迟是由于移动端需要通过在这个时间段用户是否两次 ...

  2. .NET基础知识点

    .NET基础知识点   l  .Net平台  .Net FrameWork框架   l  .Net FrameWork框架提供了一个稳定的运行环境,:来保障我们.Net平台正常的运转   l  两种交 ...

  3. JavaScript 开发者经常忽略或误用的七个基础知识点(转)

    JavaScript 本身可以算是一门简单的语言,但我们也不断用智慧和灵活的模式来改进它.昨天我们将这些模式应用到了 JavaScript 框架中,今天这些框架又驱动了我们的 Web 应用程序.很多新 ...

  4. JavaScript 开发者经常忽略或误用的七个基础知识点

    JavaScript 本身可以算是一门简单的语言,但我们也不断用智慧和灵活的模式来改进它.昨天我们将这些模式应用到了 JavaScript 框架中,今天这些框架又驱动了我们的 Web 应用程序.很多新 ...

  5. JavaScript开发者常忽略或误用的七个基础知识点

    JavaScript 本身可以算是一门简单的语言,但我们也不断用智慧和灵活的模式来改进它.昨天我们将这些模式应用到了 JavaScript 框架中,今天这些框架又驱动了我们的 Web 应用程序.很多新 ...

  6. JavaScript语言基础知识点图示(转)

    一位牛人归纳的JavaScript 语言基础知识点图示. 1.JavaScript 数据类型 2.JavaScript 变量 3.Javascript 运算符 4.JavaScript 数组 5.Ja ...

  7. JavaScript 语言基础知识点总结

    网上找到的一份JavaScript 语言基础知识点总结,还不错,挺全面的. (来自:http://t.cn/zjbXMmi @刘巍峰 分享 )  

  8. c语言学习之基础知识点介绍(三):scanf函数

    本节继续介绍c语言的基础知识点. scanf函数:用来接收用户输入的数据. 语法:scanf("格式化控制符",地址列表); 取地址要用到取地址符:&(shift+7) 例 ...

  9. c语言学习之基础知识点介绍(二):格式化控制符和变量的补充

    上节简单介绍了c语言中的一些基础知识点,本节将对之前介绍的不够详细的知识点进行补充. 格式化控制符的消息介绍: %d的其他控制符: 1.%md:m代表这个整数位占用多少位,m是一个整数.实际数字不足的 ...

随机推荐

  1. c++ 类的对象与指针

    这里首先我们需区分一下指针数组和数组指针. 指针数组:int *p[4];它最终是个数组,只是这个数组存储的是4个指向int类型的指针. 数组指针:int (*P)[4];它最终是个指针,表示一个指向 ...

  2. Html中如何让超链接a、图片img居中

    一.问题来源 修改博客页面时,突然想到 二.解决办法 2.1原来办法 在img和a中加入align="center",发现不行 2.2百度答案 <div align=&quo ...

  3. 移动开发:初学 iOS-UIViewController 心得

    初学 iOS,本文翻译了一些 iOS 官网上的 UIViewController 的知识点,如有不到位或不正确的地方,还请指正: 本文所介绍的内容的目标: 理解content view control ...

  4. jsp接收相同复合参数 request.getParameterValues()用法

    在网站中往往需要用户选择复选框,此时需要创建多个复选框让用户进行选择: <head> <meta http-equiv="Content-Type" conten ...

  5. vcastr2.0插件超级简单使用

                Vcastr2.0简单使用 友情提示:1.蓝色文字为必修改内容.2.#字符后面是解释该代码段的主要内容 1. 引用swfobject.js文件 #public/videoplu ...

  6. 调试Android USB遇到的令人费解的问题

    上周参照网上代码,做了USB的初步探测程序,工作正常 .今天从硬件部拿到了一段例程,原本打算参考它来完善自己的程序.但运行之后总是报错,逐步跟进错误,进而发现了一个匪疑所思的问题.调试一天也未发现原因 ...

  7. 如何关闭win7的ps/2兼容鼠标(触屏版)

    买了一个新电脑联想ThinkPad E555 可是刚拿到是个win10 的系统,用习惯了win7,win0不太好用, 然后帮我刷成了win7,之后一切都好,性能也是让我很满意,但是却关不掉触控板,于是 ...

  8. How to: Implement a Windows Communication Foundation Service Contract

    This is the second of six tasks required to create a basic Windows Communication Foundation (WCF) se ...

  9. Toad for Oracle 12 download link

    Toad for Oracle 12 download link x64-bit http://us-downloads.quest.com/Repository/support.quest.com/ ...

  10. BGP详解

    相信各位站长在托管服务器或者选择虚拟主机的时候,提供商都会说他们的机房是双线机房,保证你的站点访问速度,那么这里所谓的双线机房到底是何意思,它又为何能提升站点的访问速度呢? 一遍小型机房的所谓双线路其 ...