.NET基础面试题整理
今年毕业,本学期找工作期间在面试前做的一些临时的准备
以下的关于老赵分享的面试题解答参考了手头的书籍和视频教程,以及网上的资料,现整理出来希望对大家有所帮助,不对或欠佳的地方望大家指出来我好改正。
1.什么是.NET?什么是CLI?什么是CLR?IL是什么?
(1).net用于代码编译和执行的集成托管环境,换句话,它管理应用程序运行的方方面面,包括首次运行的编译,为程序分配内存
存储数据和指令,对于应用程序授予或拒绝相应的权限,并启动管理应用程序的执行,剩余内存的在分配。由于所有.net应用程序
都是在.net framework上面执行,所以开发人员只需考虑与.net framework打交道,而不必关系和底层操作系统上面的实现
包括CLR和BCL
(2).CLI(common language infrastructure)公共语言基础结构,一项国际性的标准,没有规定标准具体如何实现。相反,它描述了一个
CLI平台在符合标准的前提下应该具有什么行为。包含了:运行时(CLR),公共中间语言(CIL),公共类型系统(CTS),
公共语言规范(CLS),元数据(Metadata),框架(framework)
(3)CLR:公共语言运行时,负责加载和运行程序 IL:中间语言,C#编译器将C#代码转换成IL,运行时能够理解IL,并编译成机器码
2.JIT是什么,它是如何工作的?GC是什么,简述一下GC的工作方式?
JIT:Just in time,C#或者是VB.NET的代码首先被编译为IL存储在本地,当要运行这些代码的时候,CLR对IL进行第二次编译转换成机器码运行。好处:可移植性,而且IL在加载到内存中时将受到类型安全性方面检查,这实现了更好的安全性和可靠性。
GC:垃圾回收(garbage collection),是根据程序的需要自动分配和回收内存的过程。垃圾回收器处理的是引用对象,而且只回收堆上的内存。这意味着假如维持对一个对象的引用,就会阻止GC重用对象使用的内存。在.NET中,垃圾回收器采用的是mark-and-compact算法。在一次垃圾回收周期开始的时候,它要识别对象的所有跟引用,根据这个引用可以遍历每个根引用所标识的一个树形结构,并递归确定所有引用指向的对象。这样一来,垃圾回收器就可以识别所有可达的对象,在执行回收的时候,GC不是枚举所有访问不到的对象,相反,通过压缩所有相邻的可达的对象来执行垃圾回收。不可访问的对象就会被覆盖。垃圾回收的宗旨是提高内存的利用率,它并不是用来清理文件句柄,和数据库连接字符串,端口或者其他有限的资源(终接器finalizer,不能被显示调用,不能传递任何参数,即不能被重载,只有垃圾回收器才能调用终接器,使用Using语句进行确定性终结
3.类(class)和结构(struct)的区别是什么?它们对性能有影响吗?
1. 值类型与引用类型
结构是值类型:值类型在栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,通过使用结构可以创建更多的值类型
类是引用类型:引用类型在堆上分配地址堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用
注:1.虽然结构与类的类型不一样,可是他们的基类型都是对象(object),c#中所有类型的基类型都是object
2.虽然结构的初始化也使用了New 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对象不可用
2.继承性
结构:不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed .
类:完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承注:虽然结构不能被继承 可是结构能够继承接口,方法和类继承接口一样
3.内部结构:
结构: 没有默认的构造函数,但是可以添加构造函数没有析构函数没有 abstract 和 sealed(因为不能继承)不能有protected 修饰符可以不使用new 初始化在结构中初始化实例字段是错误的
类: 有默认的构造函数 有析构函数 可以使用 abstract 和 sealed 有protected 修饰符
必须使用new 初始化
4..NET BCL里有哪些是类(结构),为什么它们不是结构(类)?
结构:System.Boolean Byte Char Decimal Double Int32
堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些 大多数情况下该类型只是一些数据时,结构时最佳的选择
类:String Object Delegate 接口 等等 包含了大量的逻辑对象,表现抽象
5.在自定义类型时,您如何选择是类还是结构?
1). 堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些
2). 结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低。
3). 在表现抽象和多级别的对象层次时,类是最好的选择
4). 大多数情况下该类型只是一些数据时,结构时最佳的选择
6.在.NET程序运行过程中,什么是堆,什么是栈?
栈通常保存着我们代码执行的步骤,而堆上存放的则多是对象,数据等。我们可以把栈想象成一个接着一个叠放在一起的盒子。当我们使用的时候,每次从最顶部取走一个盒子。栈也是如此,当一个方法(或类型)被调用完成的时候,就从栈顶取走(called a Frame,译注:调用帧),接着下一个。堆则不然,像是一个仓库,储存着我们使用的各种对象等信息,跟栈不同的是他们被调用完毕不会立即被清理掉。
栈内存无需我们管理,也不受GC管理。当栈顶元素使用完毕,立马释放。而堆则需要GC(Garbage collection:垃圾收集器)清理
7.什么情况下会在堆(栈)上分配数据?它们有性能上的区别吗?“结构”对象可能分配在堆上吗?什么情况下会发生,有什么需要注意的吗?
1)值类型一般分配在对上面,引用类型分配在堆上面。栈的效率要高于堆。
2)可能,当在类中定义一个结构类型时,该结构就分配在堆上
8.泛型的作用是什么?它有什么优势?它对性能有影响吗?它在执行时的行为是什么?
作用:为了促进代码的重用,尤其是算法的重用
优势:(1)可重用性(2)类型安全,在参数化的类中只有成员明确希望的数据类型才可以使用(3)性能:避免了从Object的强制转换和值类型的装箱(4)减小了内存消耗:避免装箱也就不在需要消耗堆上的内存。
执行时的行为:泛型也是对象,泛型类的“类型参数”变成了元数据;CLR会在需要的时候构造利用它们的类。一个泛型类经过编译好之后和普通的类并没有什么区别。编译的结果只有元数据和CIL。基于值类型的泛型实例化:CLR会讲指定的类型参数放到CIL中合适的位置,从而创建一个具体化的泛型类型。所以CLR会为没个新的参数值创建具体的泛型类型
基于引用类型的实例化:CLR会创建一个具体化的泛型类型。以后,每次用一个引用类型参数来说实例化一个构造好的类型时,并在CIL中用Object引用替换类型参数,CLR都会重用以前生成好的泛型版本
9..NET BCL中有哪些泛型类型?举例说明平时编程中您定义的泛型类型。
List<T>:通过索引访问强类型的列表
Dictionary<T>:表示键值对的集合
Queue<T>:队列 Stack<T>: 栈
购物车用Dictionary模拟,OA中获取员工列表等数据的时候,返回值是泛型的
10.异常的作用是什么?.NET BCL中有哪些常见的异常?在代码中您是如何捕获/处理异常的?在“catch (ex)”中,“throw”和“throw ex”有什么区别?您会如何设计异常的结构,什么情况下您会抛出异常?
(1)C# 语言的异常处理功能可帮助您处理程序运行时出现的任何意外或异常情况
(2)throw会保留堆栈信息。throw ex 不会。当然,如果你抛出新的异常之前设置innerException的话,可以通过innerException的堆栈访问原有的堆栈。
(3)靠异常才能发现错误的,通过try catch finally来捕获异常。如果是未预料到的则不处理(内存不足,删除文件)直接报错更容易发现错误catch块从最具体到常规排列
11.List<T>和T[]的区别是什么,平时你如何进行选择?Dictionary<TKey, TValue>是做什么的?.NET BCL中还有哪些常用的容器?它们分别是如何实现的(哪种数据结构)?分别是适用于哪些场景?
1.List<T>arrylist的泛型版本,大小是可变的,T[]继承自Array,大小是固定的。如果大小没有怎么变化,选择T[],一般情况下选择List<T>
2.Dictionary是hashtable的泛型版本,用来存储键值对的.例如:sortlist,stack等
12抽象类和接口有什么区别?使用时有什么需要注意的吗?
如何选择是定义一个“完全抽象”的抽象类,还是接口?什么是接口的“显式实现”?为什么说它很重要?
相同点:都不能被直接实例化,都通过继承实现其抽象方法
不同点:
(1) 接口支持多继承;抽象类不能实现多继承。
(2) 接口只能定义行为;抽象类既可以定义行为,还可能提供实现。
(3) 抽象类允许包含实现的virtual成员,所以能为派生类成员提供一个默认的实现,而接口所有的成员自动成为virtual成员,而且不能包含任何实现
13.字符串是引用类型类型还是结构类型? 引用类型
它和普通的引用类型相比有什么特别的地方吗?不可变的
使用字符串时有什么需要注意的地方?为什么说StringBuilder比较高效?
当拼接两个字符串时,系统先是把两个字符串写入内存,接着删除原来的String对象,然后创建一个String对象,并读取内存中的数据赋给该对象。这一来二去的,耗了不少时间。而使用System.Text命名空间下面的StringBuilder类就不是这样了,它提供的Append方法,能够在已有对象的原地进行字符串的修改,简单而且直接。
在连接多个字符串时,它无论何时都比直接相加更高效吗?
不一定,在1000个字符以内效果一样,达到10000时StringBuilder类的效率会显著提升
如何高效地进行数组复制?“二维数组”和“数组的数组”有什么区别?
数组复制的方法:for CopyTo() 静态CopyTo() Clone
14.什么是元编程,.NET有哪些元编程的手段和场景?什么是反射?能否举一些反射的常用场景?有人说反射性能较差,您怎么看待这个问题?有什么办法可以提高反射的性能吗?
学着做OA的时候,动态加载不同的DataProvider(Oracle和Sqlserver),方便,可以随时替换不用重新编译程序
15.委托是什么?匿名方法是什么?在C# 3.0中,Lambda表达式是什么?扩展方法是什么?LINQ是什么?您觉得C# 3.0中还有哪些重要的特性,它们带来了什么优势?BCL中哪些类库和这些特性有关?您平时最常用哪些?
委托可以把一个方法作为参数代入另一个方法。
委托可以理解为指向一个函数的指针。
匿名方法:就是没有实际方法声明的委托实例。或者说,它们的定义是直接内嵌在代码中的。
Lambda表达式:是比匿名方法更加简洁的一种匿名函数语法
委托和事件没有可比性,因为委托是类型,事件是对象,下面说的是委托的对象(用委托方式实现的事件)和(标准的event方式实现)事件的区别。事件的内部是用委托实现的。因为对于事件来讲,外部只能“注册自己+=、注销自己-=”,外界不可以注销其他的注册者,外界不可以主动触发事件,因此如果用Delegate就没法进行上面的控制,因此诞生了事件这种语法。事件是用来阉割委托实例的,类比用一个自定义类阉割List。事件只能add、remove自己,不能赋值。事件只能+=、-=,不能= 。事件内部就是一个private的委托和add、remove两个方法。
16.工作之外您看哪些技术相关的书、网站、社区、项目等等?
您还接触哪些.NET以外的技术,能和.NET或.NET中有针对性的部分做个对比吗?
C#本质论,SQL Server2008实战,数据结构,ASP.NET揭秘,Javascript深入浅出
17.website和webapplication的区别
1)website修改后不需要重启即可看到效果,webapplication需要
2)website不分namespace,webapplication有namespace
3)website为了兼容asp转过来的开发人员习惯
4)没有技术上的区别,调试习惯不同
5)website为每个编译为一个dll,webapplication生成一个dll
6)不利于工程开发,比如代码出错不容易发现
18.提交到服务器的表单要设置name,id可以不设置,服务器只用name,Dom用id
19.为了区分是第一次进入页面还是点击提交以后重新进入,form有一个隐藏字段:
<input type=“hidden” name=“ispostback” value=“true”/>,如果从Request中读取到ispostback=true,说明点击提交按钮提交进入ashx,否则是第一次进入ashx
20.Http是请求-响应模型,服务器不会读取浏览器的网页,能够得到的就是网页提交过来的数据。
21.get与post提交的比较
Get:通过URL传递表单的值(默认),?...&,安全性低,传递比较小的数据。
Post:传递的值隐藏在http报文中,URL中看不到,刷新页面会弹出提示对话框如果
22. 实现div内文本自增,因为服务器不记得上次给浏览器的值是多少,而且不像input那样会将上次的值重新提交回来,因此浏览器需要用一个隐藏的字段将上次的值保存下来
23.ViewState实现原理
非表单元素无法将客户端的元素值传递给服务端,即使是表单元素也只能传递value值,对于其他属性值,比如背景颜色,大小等也是无法传递的,因此对于这些值都要存在隐藏字段中。Viewstate是跟页面相关的,不用的页面viewstate也会不同,不会相互影响。ViewState对需要PostBack处理的页面才可能有用,对于新闻展示这类页面不需要交互,完全可以禁用ViewState来提升性能。如果完全没有ViewState,则页面中不能有runat=server的form
24.Cookie
表单是和页面相关的,只有浏览器提交了这些数据服务器才能得到,Cookie是和站点相关的,每次向服务器请求的时候除了发送表单数据外,还会将和站点相关的所有Cookie都提交给服务器,这是强制性的
缺点:不能存储过多的信息,安全性差
针对互联网的优化:图片服务器和主站域名不一样
25.http请求,css,js,图片,单独请求,200表示处理成功,301重定向,400错误请求
307临时重定向,404页面未找到,403禁止,401未认证,500server内部错误,503访问人数过多。
26./:网站根目录,../上一级目录,./当前目录,~/应用程序根目录
27.数据库查询性能优化
1)中只返回需要的列
2)在减少使用列的同时,考虑减少行,使用where子句
3)只在需要的时候用order by
4)避免在from,where和having子句中隐式数据类型的转换
28、什么是面向对象
面向对象OO = 面向对象的分析OOA + 面向对象的设计OOD + 面向对象的编程OOP;
通俗的解释就是万物皆对象,把所有的事物都看作一个个可以独立的对象(单元),它们可以自己完成自己的功能,而不是像C那样分成一个个函数;
现在纯正的OO语言主要是java和C#,C++也支持OO,C是面向过程的。
29、简述 private、 protected、 public、 internal 修饰符的访问权限。
private : 私有成员, 在类的内部才可以访问。
protected : 保护成员,该类内部和继承类中可以访问。
public : 公共成员,完全公开,没有访问限制。
internal: 当前程序集内可以访问。
30、ADO.NET中的五个主要对象
Connection:主要是开启程序和数据库之间的连结。没有利用连结对象将数据库打开,是无法从数据库中取得数据的。这个物件在ADO.NET 的最底层,我们可以自己产生这个对象,或是由其它的对象自动产生。
Command:主要可以用来对数据库发出一些指令,例如可以对数据库下达查询、新增、修改、删除数据等指令,以及呼叫存在数据库中的预存程序等。这个对象是架构在Connection 对象上,也就是Command 对象是透过连结到数据源。
DataAdapter:主要是在数据源以及DataSet 之间执行数据传输的工作,它可以透过Command 对象下达命令后,并将取得的数据放入DataSet 对象中。这个对象是架构在Command对象上,并提供了许多配合DataSet 使用的功能。
DataSet:这个对象可以视为一个暂存区(Cache),可以把从数据库中所查询到的数据保留起来,甚至可以将整个数据库显示出来。DataSet 的能力不只是可以储存多个Table 而已,还可以透过DataAdapter对象取得一些例如主键等的数据表结构,并可以记录数据表间的关联。DataSet 对象可以说是ADO.NET 中重量级的对象,这个对象架构在DataAdapter对象上,本身不具备和数据源沟通的能力;也就是说我们是将DataAdapter对象当做DataSet 对象以及数据源间传输数据的桥梁。
DataReader:当我们只需要循序的读取数据而不需要其它操作时,可以使用DataReader 对象。DataReader对象只是一次一笔向下循序的读取数据源中的数据,而且这些数据是只读的,并不允许作其它的操作。因为DataReader 在读取数据的时候限制了每次只读取一笔,而且只能只读,所以使用起来不但节省资源而且效率很好。使用DataReader 对象除了效率较好之外,因为不用把数据全部传回,故可以降低网络的负载。
ADO.NET 使用Connection 对象来连接数据库,使用Command 或DataAdapter对象来执行SQL语句,并将执行的结果返回给DataReader 或 DataAdapter ,然后再使用取得的DataReader 或DataAdapter 对象操作数据结果。
31、列举ASP.NET 页面之间传递值的几种方式。
1.使用QueryString, 如....?id=1; response. Redirect()....
2.使用Session变量
3.使用Server.Transfer
4.Cookie传值
5.Application传值
6.文件存储
32、C#中的委托是什么?事件是不是一种委托?
委托可以把一个方法作为参数代入另一个方法。
委托可以理解为指向一个函数的引用。
是,是一种特殊的委托。
33、override与重载的区别
重载是方法的名称相同。参数或参数类型不同,进行多次重载以适应不同的需要
Override 是进行基类中函数的重写。为了适应需要。
34、描述一下C#中索引器的实现过程,是否只能根据数字进行索引?
不是。可以用任意类型。
避免为索引器设置除 System.Int32、System.Int64、System.String、System.Object、枚举或泛型类型参数之外的其他参数类型。(谢谢17楼,吴峰 指出)
35、三层架构
通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。
区分层次的目的即为了“高内聚,低耦合”的思想。
表现层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候的所见所得。
业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。
数据访问层(DAL):该层所做事务直接操作数据库,针对数据的增添、删除、修改、更新、查找等每层之间是一种垂直的关系。
三层结构是N层结构的一种,一般来说,层次之间是向下依赖的,下层代码未确定其接口(契约)前,上层代码是无法开发的,下层代码接口(契约)的变化将使上层的代码一起变化。
优点: 分工明确,条理清晰,易于调试,而且具有可扩展性。
缺点: 增加成本。
36、MVC模式
MVC(Model View Controller)模型-视图-控制器
MVC是典型的平行关系,没有说谁在上谁在下的关系,模型负责业务领域的事情,视图负责显示的事情,控制器把数据读取出来填充模型后把模型交给视图去处理。而各种验证什么的应该是在模型里处理了。它强制性的使应用程序的输入、处理和输出分开。MVC最大的好处是将逻辑和页面分离。
37、什么是装箱和拆箱?
装箱:从值类型接口转换到引用类型。
拆箱:从引用类型转换到值类型。
38、什么叫应用程序域
一种边界,它由公共语言运行库围绕同一应用程序范围内创建的对象建立(即,从应用程序入口点开始,沿着对象激活的序列的任何位置)。
应用程序域有助于将在一个应用程序中创建的对象与在其他应用程序中创建的对象隔离,以使运行时行为可以预知。
在一个单独的进程中可以存在多个应用程序域。应用程序域可以理解为一种轻量级进程。起到安全的作用。占用资源小。
39、CTS、CLS、CLR分别作何解释
CTS:Common Type System 通用系统类型。
CLS:Common Language Specification 通用语言规范。
CLR:Common Language Runtime 公共语言运行库。
40、在dotnet中类(class)与结构(struct)的异同?
相同点:语法类似
不同点:
1.class是引用类型,继承自System.Object类;struct是值类型,继承自System.ValueType类,因此不具多态性。但是注意,System.ValueType是个引用类型。
2.从职能观点来看,class表现为行为;而struct常用于存储数据。
3.class支持继承,可以继承自类和接口;而struct没有继承性,struct不能从class继承,也不能作为class的基类,但struct支持接口继承。
4.class可以声明无参构造函数,可以声明析构函数;而struct只能声明带参数构造函数,且不能声明析构函数。因此,struct没有自定义的默认无参构造函数,默认无参构造器只是简单地把所有值初始化为它们的0等价值。
5.实例化时,class要使用new关键字;而struct可以不使用new关键字,如果不以new来实例化struct,则其所有的字段将处于未分配状态,直到所有字段完成初始化,否则引用未赋值的字段会导致编译错误。
6.class可以是抽象类(abstract),可以声明抽象函数;而struct为抽象,也不能声明抽象函数。
7.class可以声明protected成员、virtual成员、sealed成员和override成员;而struct不可以,但是值得注意的是,struct可以重载System.Object的3个虚方法,Equals()、ToString()和GetHashTable()。
8.class的对象复制分为浅拷贝和深拷贝,必须经过特别的方法来完成复制;而struct创建的对象复制简单,可以直接以等号连接即可。
9.class实例由垃圾回收机制来保证内存的回收处理;而struct变量使用完后立即自动解除内存分配。
10.作为参数传递时,class变量是以按址方式传递;而struct变量是以按值方式传递的。
该答案转自:Anytao的[你必须知道的.NET] 第四回:后来居上:class和struct 关于类分配在堆上,结构分配在栈上 存在争议,这种说法应该指通常情况下 另见 xiaotie的 Struct与Class辨析 ,谢谢指正
41、堆和栈的区别?
栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;
堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小。
42、能用foreach遍历访问的对象的要求
需要实现IEnumerable接口或声明GetEnumerator方法的类型。
43、GC是什么? 为什么要有GC?
GC是垃圾收集器。程序员不用担心内存管理,因为垃圾收集器会自动进行管理。
要请求垃圾收集,可以调用下面的方法之一: System.gc() Runtime.getRuntime().gc()
44、String s = new String("xyz");创建了几个String Object?
对于.NET来说该题是错误的,根本就没这样的构造函数。谢谢 37楼,赵伟 43楼,DiggingDeeply 指正
String a="xyz";首先会到常量池中去查找,如果存在就不再分配,如果不存在就分配,常量池中的数据是在编译期赋值的,也就是生成class文件时就把它放到常量池里了。
45、值类型和引用类型的区别?
1.赋值方式不同:基于值类型的变量直接包含值。将一个值类型变量赋给另一个值类型变量时,将复制包含的值。引用类型变量的赋值只复制对对象的引用,而不复制对象本身。
2.值类型不可能派生出新的类型:所有的值类型均隐式派生自 System.ValueType。但与引用类型相同的是,结构也可以实现接口。
3.值类型不可能包含 null 值:然而,可空类型功能允许将 null 赋给值类型。
4.每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。
46、C#中的接口和类有什么异同。
不同点:
不能直接实例化接口。
接口不包含方法的实现。
接口可以多继承,类只能单继承。
类定义可在不同的源文件之间进行拆分。
相同点:
接口、类和结构都可以从多个接口继承。
接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员。
接口和类都可以包含事件、索引器、方法和属性。
47、abstract class和interface有什么区别?
相同点:
都不能被直接实例化,都可以通过继承实现其抽象方法。
都是面向抽象编程的技术基础,实现了诸多的设计模式。
不同点:
接口支持多继承;抽象类不能实现多继承。
接口只能定义抽象规则;抽象类既可以定义规则,还可能提供已实现的成员。
接口是一组行为规范;抽象类是一个不完全的类,着重族的概念。
接口可以用于支持回调(CallBack);抽象类不能实现回调,因为继承不支持。
接口只包含方法(Method)、属性(Property)、索引器(Index)、事件(Event)的签名,但不能定义字段和包含实现的方法;
抽象类可以定义字段、属性、包含有实现的方法。
接口可以作用于值类型(Struct)和引用类型(Class);抽象类只能作用于引用类型。例如,Struct就可以继承接口,而不能继承类。
48、sleep() 和 wait() 有什么区别?
sleep()方法是将当前线程挂起指定的时间。
wait()释放对象上的锁并阻塞当前线程,直到它重新获取该锁。
49、是否可以继承String类?
String类是sealed类故不可以继承。(.NET中没有final关键字,谢谢14楼 New.min 和15楼 Duron800 指正)
50、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
会执行,在return前执行。
51、在一个已经排序的Int数组中,查找某个number,如果存在这个number,返回在数组的位置,反之返回-1
//------------------------------------------------------------------------------
// <copyright file="Runner.cs" company="CNBlogs Corporation" owner="请叫我头头哥">
// Copyright (C) 2015-2016 All Rights Reserved
// 原博文地址: http://www.cnblogs.com/toutou/
// </copyright>
//------------------------------------------------------------------------------
namespace TestApp
{
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
class Runner
{
static void Main(string[] args)
{
int[] arr = { 3, 5, 6, 7, 8, 9, 14, 23, 45, 56, 63, 72, 87, 91, 92, 93, 95, 97, 98, 534, 555, 676, 878, 988, 1365 };
int number = 555;
int result = Search(arr, number);
Console.WriteLine(result);
Console.ReadKey();
}
public static int Search(int[] arr, int number)
{
int result = 0;
if (arr == null || arr.Length == 0 || number > arr[arr.Length - 1] || number < arr[0])
{
result = -1;
}
else
{
result = Bisearch(arr.Length - 1, arr, number);
}
return result;
}
public static int Bisearch(int endIndex, int[] arr, int number, int startIndex = 0)
{
int result = 0;
if ((endIndex - startIndex) < 2)
{
for (int i = startIndex; i <= endIndex; i++)
{
if (arr[i] == number)
{
result = i;
break;
}
else
{
result = -1;
}
}
}
else
{
if (arr[startIndex] <= number && number <= arr[(endIndex + startIndex) / 2])
{
Bisearch((endIndex + startIndex) / 2, arr, number, startIndex);
}
else
{
Bisearch(endIndex, arr, number, (endIndex + startIndex) / 2 + 1);
}
}
return result;
}
}
}
52、{"12,bob","3,sky","6,cool","1,good","22,go"},按元素第一列排序
namespace TestApp
{
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main(string[] args)
{
string[] source = new string[] { "12,bob", "3,sky", "6,cool", "1,good", "22,go" };
for (int i = 0; i < source.Length; i++)
{
for (int j = i; j < source.Length; j++)
{
if (Convert.ToInt32(Regex.Match(source[i], @"\d+").Value) > Convert.ToInt32(Regex.Match(source[j], @"\d+").Value))
{
string temp = source[i];
source[i] = source[j];
source[j] = temp;
}
}
}
for (int i = 0; i < source.Length; i++)
{
Console.WriteLine(source[i]);
}
}
}
}
2019年.net常见面试问题
声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。
Tags in this post...
Reply on: @reply_date@
@reply_contents@