C#面试常考得几个问题-程序员宅基地

技术标签: c#  面试  数据结构与算法  

>什么是.NET?什么是CLI?什么是CLRIL是什么?JIT是什么,它是如何工作的?GC是什么,简述一下GC的工作方式?

CLI是规范; CLR是对CLI的实现; .NET是基于CLR构建的一套框架;

开发人员需要通过ILCLR进行交流,虽然IL本身支持一些面向对象的概念,但是对于开发人员来讲还是过于复杂低效,于是C#应运而生,程序员只需编写C#代码, csc编译器会将其翻译成IL;

虽然CLR理解IL,但是CPU只认识二进制指令,所以CLR需要JIT的帮助,IL翻译成CPU指令. JIT按需工作,当一个.NET方法即将被执行时, JIT会介入,把该方法(IL指令)编译成CPU指令,并保存以供重用.

GC被用来回收当前进程中已无人使用的垃圾对象; GC会被某些事件触发(比如, 0代对象满,内存压力大, appdomain被卸载),随后遍历GC堆上的对象,并通过该对象是否被root直接/间接引用(更进一步, “一个对象是否可以被回收还会依赖于F-Reachable QueueGC Handle Table”)来判断一个对象是否需要被回收.

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

简单说来,类是引用类型,结构是值类型;

值类型对象直接分配在当前线程的栈上,引用类型对象位于GC堆上,所以值类型对象无法在多个方法中传递,而引用类型会承担更多的任务,比如,用于线程同步(Monitor.Enter(…))当一个引用类型的对象被创建时,会需要4+4=8byte的额外空间开销(32bit OS),同时过度的使用引用类型对象会增加GC堆的压力,频繁的GC对程序的性能还是有一些影响的.

BCL中的Byte类型是一个结构体,至于为什么它不是一个类,我觉得可能是设计者认为Byte不应该被继承,或者8byte的额外开销无法承受吧.

什么时候使用值类型/引用类型还是应当具体情况具体分析, 对于引用类型,能用sealedsealed,在方法调用时开销会小一些.

>.NET程序运行过程中,什么是堆,什么是栈?什么情况下会在堆(栈)上分配数据?它们有性能上的区别吗?结构对象可能分配在堆上吗?什么情况下会发生,有什么需要注意的?

.NET进程被创建时就会有一个堆随之被创建,用来保存该进程在运行中需要使用的对象/数据;当一个线程被创建时,会有一个栈被创建,用来保存方法调用参数,局部变量等轻量型数据.

当一个类里面包含一个结构体类型的变量时,该结构体类型会被分配在堆上.(不知道有什么需要注意的…)

>泛型的作用是什么?它有什么优势?它对性能有影响吗?它在执行时的行为是什么?.NET BCL中有哪些泛型类型?举例说明平时编程中您定义的泛型类型

泛型有利于算法重用.

.NET进程地址空间中,对象和类型是分开存放的,当我们实例化一个泛型的时候(比如List<int> list = new List<int>();),会有一个新的类型对象被创建(该对象并不位于GC堆上),当我们在使用这个实例化泛型去创建新的对象时,才会有一个对象(GC堆上)被创建.所以性能上会有些许的损失.当我们使用一个值类型作为参数,去调用一个接收引用类型参数的方法是,会有装箱发生,这时我们可以考虑实现一个泛型,并在运行时确定方法的参数类型.

>异常的作用是什么?.NET BCL中有哪些常见的异常?在代码中您是如何捕获/处理异常的?在“catch (ex)”中,“throw”和“throw ex”有什么区别?您会如何设计异常的结构,什么情况下您会抛出异常?

,异常可以通知我们程序出错,比如ArgumentException, NullReferenceException…

异常的发生会导致一次stack walk,去寻找对应的exception handler,在这个过程中, stack trace的信息会被一层层的收集, throw ex会清空之前收集的stack trace的信息,相当于抛出了一个新的异常,throw不会,所以throw ex不利于找出问题所在.

不同的layer应该catch不同exception,最上层处理最generalexception,底层去处理一些detailexception.

> List<T>T[]的区别是什么,平时你如何进行选择?Dictionary<TKey, TValue>是做什么的?.NET BCL中还有哪些常用的容器?它们分别是如何实现的(哪种数据结构)?分别是适用于哪些场景?

T[]继承自Array,List<T>仅仅是对T[]的封装;相比于T[], List<T>size是动态变化的.

Dictionary<TKey, TValue>可以用来存储键/值对.其他的比如HashTable, SortedList.

>抽象类和接口有什么区别?使用时有什么需要注意的吗?如何选择是定义一个完全抽象的抽象类,还是接口?什么是接口的显式实现?为什么说它很重要?

抽象类定义了一个类及其子类是什么,而接口更多的表现出一个类可以做什么.

当一个类实现连个不同的接口,而这两个接口中包含一些相同签名的方法时需要用到显示实现.

>字符串是引用类型类型还是结构类型?它和普通的引用类型相比有什么特别的地方吗?使用字符串时有什么需要注意的地方?为什么说StringBuilder比较高效?在连接多个字符串时,它无论何时都比直接相加更高效吗?

String是引用类型,其特殊之处在于一个string是不可变的,当我们对两个string使用连接操作时,会生成一个新的string对象,而原来的两个string保持不变.

在和native代码做interop,对于传出参数(char* outStr),应当选择使用stringbuilder而非string.

StringBuilder内部维护着一个char[]数组,在做连接字符的操作时会动态增加其大小,但是,当原有的数组不够用时, StringBuilder会重新创建一个新的char[]数组,值得注意的是原来的数组不会被抛弃,新创建的数组只会用作存储新添加的字符.

如果说StringBuilder不高效的话,应该就是在原有数组空间用尽的情况下吧.

>如何高效地进行数组复制?二维数组数组的数组有什么区别?在使用双重循环遍历一个二维数组时,如何选择内外层的遍历顺序?

不清楚,因为数组的元素在内存中的分布是连续的,我能想到的方法是直接使用内存拷贝API.

二维数组是二维的,数组的数组是一维的.

根据内存局部性原理, CPU在读取二维数组的第一个元素是,第一行的数据也会被一起读入cache,所以应当先遍历行,随后遍历列.

>什么是.NET?什么是CLI?什么是CLRIL是什么?JIT是什么,它是如何工作的?GC是什么,简述一下GC的工作方式?

CLI是规范; CLR是对CLI的实现; .NET是基于CLR构建的一套框架;

开发人员需要通过ILCLR进行交流,虽然IL本身支持一些面向对象的概念,但是对于开发人员来讲还是过于复杂低效,于是C#应运而生,程序员只需编写C#代码, csc编译器会将其翻译成IL;

虽然CLR理解IL,但是CPU只认识二进制指令,所以CLR需要JIT的帮助,IL翻译成CPU指令. JIT按需工作,当一个.NET方法即将被执行时, JIT会介入,把该方法(IL指令)编译成CPU指令,并保存以供重用.

GC被用来回收当前进程中已无人使用的垃圾对象; GC会被某些事件触发(比如, 0代对象满,内存压力大, appdomain被卸载),随后遍历GC堆上的对象,并通过该对象是否被root直接/间接引用(更进一步, “一个对象是否可以被回收还会依赖于F-Reachable QueueGC Handle Table”)来判断一个对象是否需要被回收.具体细节还这真不是半个小时能讲完的J

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

简单说来,类是引用类型,结构是值类型;

值类型对象直接分配在当前线程的栈上,引用类型对象位于GC堆上,所以值类型对象无法在多个方法中传递,而引用类型会承担更多的任务,比如,用于线程同步(Monitor.Enter(…))当一个引用类型的对象被创建时,会需要4+4=8byte的额外空间开销(32bit OS),同时过度的使用引用类型对象会增加GC堆的压力,频繁的GC对程序的性能还是有一些影响的.

BCL中的Byte类型是一个结构体,至于为什么它不是一个类,我觉得可能是设计者认为Byte不应该被继承,或者8byte的额外开销无法承受吧.

什么时候使用值类型/引用类型还是应当具体情况具体分析,个人倾向引用类型,因为这样在设计的时候会少费些脑子,不过能用sealedsealed,在方法调用时开销会小一些.

>.NET程序运行过程中,什么是堆,什么是栈?什么情况下会在堆(栈)上分配数据?它们有性能上的区别吗?“结构”对象可能分配在堆上吗?什么情况下会发生,有什么需要注意的吗?

.NET进程被创建时就会有一个堆随之被创建,用来保存该进程在运行中需要使用的对象/数据;当一个线程被创建时,会有一个栈被创建,用来保存方法调用参数,局部变量等轻量型数据.

当一个类里面包含一个结构体类型的变量时,该结构体类型会被分配在堆上.(不知道有什么需要注意的…)

>泛型的作用是什么?它有什么优势?它对性能有影响吗?它在执行时的行为是什么?.NET BCL中有哪些泛型类型?举例说明平时编程中您定义的泛型类型.

泛型有利于算法重用.

.NET进程地址空间中,对象和类型是分开存放的,当我们实例化一个泛型的时候(比如List<int> list = new List<int>();),会有一个新的类型对象被创建(该对象并不位于GC堆上),当我们在使用这个实例化泛型去创建新的对象时,才会有一个对象(GC堆上)被创建.所以性能上会有些许的损失.当我们使用一个值类型作为参数,去调用一个接收引用类型参数的方法是,会有装箱发生,这时我们可以考虑实现一个泛型,并在运行时确定方法的参数类型.

>异常的作用是什么?.NET BCL中有哪些常见的异常?在代码中您是如何捕获/处理异常的?在“catch (ex)”中,“throw”“throw ex”有什么区别?您会如何设计异常的结构,什么情况下您会抛出异常?

,异常可以通知我们程序出错,比如ArgumentException, NullReferenceException…

异常的发生会导致一次stack walk,去寻找对应的exception handler,在这个过程中, stack trace的信息会被一层层的收集, throw ex会清空之前收集的stack trace的信息,相当于抛出了一个新的异常,throw不会,所以throw ex不利于找出问题所在.

不同的layer应该catch不同exception,最上层处理最generalexception,底层去处理一些detailexception.

> List<T>T[]的区别是什么,平时你如何进行选择?Dictionary<TKey, TValue>是做什么的?.NET BCL中还有哪些常用的容器?它们分别是如何实现的(哪种数据结构)?分别是适用于哪些场景?

T[]继承自Array,List<T>仅仅是对T[]的封装;相比于T[], List<T>size是动态变化的.

Dictionary<TKey, TValue>可以用来存储键/值对.其他的比如HashTable, SortedList.

>抽象类和接口有什么区别?使用时有什么需要注意的吗?如何选择是定义一个完全抽象的抽象类,还是接口?什么是接口的显式实现?为什么说它很重要?

抽象类定义了一个类及其子类是什么,而接口更多的表现出一个类可以做什么.

当一个类实现连个不同的接口,而这两个接口中包含一些相同签名的方法时需要用到显示实现.

>字符串是引用类型类型还是结构类型?它和普通的引用类型相比有什么特别的地方吗?使用字符串时有什么需要注意的地方?为什么说StringBuilder比较高效?在连接多个字符串时,它无论何时都比直接相加更高效吗?

String是引用类型,其特殊之处在于一个string是不可变的,当我们对两个string使用连接操作时,会生成一个新的string对象,而原来的两个string保持不变.

在和native代码做interop,对于传出参数(char* outStr),应当选择使用stringbuilder而非string.

StringBuilder内部维护着一个char[]数组,在做连接字符的操作时会动态增加其大小,但是,当原有的数组不够用时, StringBuilder会重新创建一个新的char[]数组,值得注意的是原来的数组不会被抛弃,新创建的数组只会用作存储新添加的字符.

如果说StringBuilder不高效的话,应该就是在原有数组空间用尽的情况下吧.

>如何高效地进行数组复制?二维数组数组的数组有什么区别?在使用双重循环遍历一个二维数组时,如何选择内外层的遍历顺序?

不清楚,因为数组的元素在内存中的分布是连续的,我能想到的方法是直接使用内存拷贝API.

二维数组是二维的,数组的数组是一维的.

根据内存局部性原理, CPU在读取二维数组的第一个元素是,第一行的数据也会被一起读入cache,所以应当先遍历行,随后遍历列.

>什么是元编程,.NET有哪些元编程的手段和场景?什么是反射?能否举一些反射的常用场景?有人说反射性能较差,您怎么看待这个问题?有什么办法可以提高反射的性能吗

对元编程了解十分有限, .NETCodeDom(或者使用reflection emit动态创建类型)应当是其中的一个场景.

基于元数据,反射帮助我们在运行时动态获取程序集/类型/方法/属性等等的信息,可以用于加载Addin.

有得必有失,反射功能强大,只要不是滥用,其带来的益处远大于性能上的损失.

>委托是什么?匿名方法是什么?在C# 3.0中,Lambda表达式是什么?扩展方法是什么?LINQ是什么?您觉得C# 3.0中还有哪些重要的特性,它们带来了什么优势?BCL中哪些类库和这些特性有关?您平时最常用哪些

委托可以认为是类型安全的函数指针,此处省略741个字

>工作之外您看哪些技术相关的书、网站、社区、项目等等?您还接触哪些.NET以外的技术,能和.NET.NET中有针对性的部分做个对比吗

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/iteye_13633/article/details/82325732

智能推荐

分布式光纤传感器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告_预计2026年中国分布式传感器市场规模有多大-程序员宅基地

文章浏览阅读3.2k次。本文研究全球与中国市场分布式光纤传感器的发展现状及未来发展趋势,分别从生产和消费的角度分析分布式光纤传感器的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场主要生产商的市场份额。主要生产商包括:FISO TechnologiesBrugg KabelSensor HighwayOmnisensAFL GlobalQinetiQ GroupLockheed MartinOSENSA Innovati_预计2026年中国分布式传感器市场规模有多大

07_08 常用组合逻辑电路结构——为IC设计的延时估计铺垫_基4布斯算法代码-程序员宅基地

文章浏览阅读1.1k次,点赞2次,收藏12次。常用组合逻辑电路结构——为IC设计的延时估计铺垫学习目的:估计模块间的delay,确保写的代码的timing 综合能给到多少HZ,以满足需求!_基4布斯算法代码

OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版-程序员宅基地

文章浏览阅读3.3k次,点赞3次,收藏5次。OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版

关于美国计算机奥赛USACO,你想知道的都在这_usaco可以多次提交吗-程序员宅基地

文章浏览阅读2.2k次。USACO自1992年举办,到目前为止已经举办了27届,目的是为了帮助美国信息学国家队选拔IOI的队员,目前逐渐发展为全球热门的线上赛事,成为美国大学申请条件下,含金量相当高的官方竞赛。USACO的比赛成绩可以助力计算机专业留学,越来越多的学生进入了康奈尔,麻省理工,普林斯顿,哈佛和耶鲁等大学,这些同学的共同点是他们都参加了美国计算机科学竞赛(USACO),并且取得过非常好的成绩。适合参赛人群USACO适合国内在读学生有意向申请美国大学的或者想锻炼自己编程能力的同学,高三学生也可以参加12月的第_usaco可以多次提交吗

MySQL存储过程和自定义函数_mysql自定义函数和存储过程-程序员宅基地

文章浏览阅读394次。1.1 存储程序1.2 创建存储过程1.3 创建自定义函数1.3.1 示例1.4 自定义函数和存储过程的区别1.5 变量的使用1.6 定义条件和处理程序1.6.1 定义条件1.6.1.1 示例1.6.2 定义处理程序1.6.2.1 示例1.7 光标的使用1.7.1 声明光标1.7.2 打开光标1.7.3 使用光标1.7.4 关闭光标1.8 流程控制的使用1.8.1 IF语句1.8.2 CASE语句1.8.3 LOOP语句1.8.4 LEAVE语句1.8.5 ITERATE语句1.8.6 REPEAT语句。_mysql自定义函数和存储过程

半导体基础知识与PN结_本征半导体电流为0-程序员宅基地

文章浏览阅读188次。半导体二极管——集成电路最小组成单元。_本征半导体电流为0

随便推点

【Unity3d Shader】水面和岩浆效果_unity 岩浆shader-程序员宅基地

文章浏览阅读2.8k次,点赞3次,收藏18次。游戏水面特效实现方式太多。咱们这边介绍的是一最简单的UV动画(无顶点位移),整个mesh由4个顶点构成。实现了水面效果(左图),不动代码稍微修改下参数和贴图可以实现岩浆效果(右图)。有要思路是1,uv按时间去做正弦波移动2,在1的基础上加个凹凸图混合uv3,在1、2的基础上加个水流方向4,加上对雾效的支持,如没必要请自行删除雾效代码(把包含fog的几行代码删除)S..._unity 岩浆shader

广义线性模型——Logistic回归模型(1)_广义线性回归模型-程序员宅基地

文章浏览阅读5k次。广义线性模型是线性模型的扩展,它通过连接函数建立响应变量的数学期望值与线性组合的预测变量之间的关系。广义线性模型拟合的形式为:其中g(μY)是条件均值的函数(称为连接函数)。另外,你可放松Y为正态分布的假设,改为Y 服从指数分布族中的一种分布即可。设定好连接函数和概率分布后,便可以通过最大似然估计的多次迭代推导出各参数值。在大部分情况下,线性模型就可以通过一系列连续型或类别型预测变量来预测正态分布的响应变量的工作。但是,有时候我们要进行非正态因变量的分析,例如:(1)类别型.._广义线性回归模型

HTML+CSS大作业 环境网页设计与实现(垃圾分类) web前端开发技术 web课程设计 网页规划与设计_垃圾分类网页设计目标怎么写-程序员宅基地

文章浏览阅读69次。环境保护、 保护地球、 校园环保、垃圾分类、绿色家园、等网站的设计与制作。 总结了一些学生网页制作的经验:一般的网页需要融入以下知识点:div+css布局、浮动、定位、高级css、表格、表单及验证、js轮播图、音频 视频 Flash的应用、ul li、下拉导航栏、鼠标划过效果等知识点,网页的风格主题也很全面:如爱好、风景、校园、美食、动漫、游戏、咖啡、音乐、家乡、电影、名人、商城以及个人主页等主题,学生、新手可参考下方页面的布局和设计和HTML源码(有用点赞△) 一套A+的网_垃圾分类网页设计目标怎么写

C# .Net 发布后,把dll全部放在一个文件夹中,让软件目录更整洁_.net dll 全局目录-程序员宅基地

文章浏览阅读614次,点赞7次,收藏11次。之前找到一个修改 exe 中 DLL地址 的方法, 不太好使,虽然能正确启动, 但无法改变 exe 的工作目录,这就影响了.Net 中很多获取 exe 执行目录来拼接的地址 ( 相对路径 ),比如 wwwroot 和 代码中相对目录还有一些复制到目录的普通文件 等等,它们的地址都会指向原来 exe 的目录, 而不是自定义的 “lib” 目录,根本原因就是没有修改 exe 的工作目录这次来搞一个启动程序,把 .net 的所有东西都放在一个文件夹,在文件夹同级的目录制作一个 exe._.net dll 全局目录

BRIEF特征点描述算法_breif description calculation 特征点-程序员宅基地

文章浏览阅读1.5k次。本文为转载,原博客地址:http://blog.csdn.net/hujingshuang/article/details/46910259简介 BRIEF是2010年的一篇名为《BRIEF:Binary Robust Independent Elementary Features》的文章中提出,BRIEF是对已检测到的特征点进行描述,它是一种二进制编码的描述子,摈弃了利用区域灰度..._breif description calculation 特征点

房屋租赁管理系统的设计和实现,SpringBoot计算机毕业设计论文_基于spring boot的房屋租赁系统论文-程序员宅基地

文章浏览阅读4.1k次,点赞21次,收藏79次。本文是《基于SpringBoot的房屋租赁管理系统》的配套原创说明文档,可以给应届毕业生提供格式撰写参考,也可以给开发类似系统的朋友们提供功能业务设计思路。_基于spring boot的房屋租赁系统论文