原文地址

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. pow(x,y):返回x的y次幂

    >>> pow(2,3) 8 >>> pow(2,5) 32 >>> pow(2,8) 256 另外一种求x的y次幂的方法: >>&g ...

  2. 2D多边形碰撞器优化器

    http://www.unity蛮牛.com/thread-19827-1-1.html http://pan.baidu.com/s/1qW2mWS8 Asset Store Link: http: ...

  3. C#中的异常处理

    C#中的异常处理 while (ex != null) { WriteExceptionLog(ex, fileName); ex = ex.InnerException; } /// <sum ...

  4. ERP 实施和应用不成功共同点

    ERP 实施和应用不成功共同点     ERP 重新得到人们理性的关注并不意味着实施和应用ERP变得轻而易举了.如何才能实施好ERP?这仍然是关键的问题. 大部份企业应用ERP不成功的原因是什么,许多 ...

  5. Trigger Execution Sequence in Oracle Forms

    Introduction ------------ This document lists the order in which triggers fire in Oracle Forms 4.5: ...

  6. git push origin master、git pull出现如下错误

    git push origin master出现如下错误: Counting objects: , done. Writing objects: % (/), bytes, done. Total ( ...

  7. Linux Kernel ‘/net/socket.c’本地信息泄露漏洞

    漏洞名称: Linux Kernel ‘/net/socket.c’本地信息泄露漏洞 CNNVD编号: CNNVD-201312-037 发布时间: 2013-12-04 更新时间: 2013-12- ...

  8. 【CSS3】

    Web前端实验室http://demo.doyoe.com/ ::before ::afterCSS3已经将伪元素的前缀更改为双冒号,而伪类则保持为单冒号 backface-visibility ht ...

  9. XHTML代码规则&手工html转换xhtml

    XHTML规则 XHTML是XML得一个应用,它遵守XML得规范和要求.从技术角度上讲.这些语法规则是由XML规范定义的. XML文档必须遵守的规则使得生成工具以解析文档变得更容易.这些规则也使得XM ...

  10. 浏览器中的XML与JavaScript

    浏览器中的XML与JavaScript 在处理XML前,你需要在JavaScript中获取它.这一部分展示了一些不同的方法用来在JavaScript中获取XML并且对它进行处理. XML的节点类型 在 ...