1、对于 Web 性能优化,您有哪些了解和经验吗?javascript
出现指数:五颗星css
主要考点:这道题是博主在博客园的新闻里面看到的,回想以前几年的面试经历,发现此题出现几率仍是比较高的。由于它的考面灰常广,可让面试官很快了解你的技术涉及面以及这些技术面的深度。html
参考答案:这个问题能够分前端和后端来讲。前端
一、前端优化java
(1)减小 HTTP 请求的次数。咱们知道每次发送http请求,创建链接和等待相应会花去至关一部分时间,因此在发送http请求的时候,尽可能减小请求的次数,一次请求能取出的数据就不要分屡次发送。jquery
(2)启用浏览器缓存,当肯定请求的数据不会发生变化时,可以直接读浏览器缓存的就不要向服务端发送请求。好比咱们ajax里面有一个参数可以设置请求的时候是否启用缓存,这种状况下就须要咱们在发送请求的时候作好相应的缓存处理。程序员
(3)css文件放 在<head>里面,js文件尽可能放在页面的底部。由于请求js文件是很花费时间,若是放在<head>里面,就会致使页面的 DOM树呈现须要等待js文件加载完成。这也就是为何不少网站的源码里面看到引用的文件放在最后的缘由。web
(4)使用压缩的css和js文件。这个不用多说,网络流量小。面试
(5)若是条件容许,尽可能使用CDN的方式引用文件,这样就能减小网络流量。好比咱们经常使用的网站http://www.bootcdn.cn/。ajax
(6)在写js和css的语法时,尽可能避免重复的css,尽可能减小js里面循环的次数,诸如此类。
二、后端优化:
(1)程序的优化:这是一个很大的话题,我这里就选几个常见的。好比减小代码的层级结构、避免循环嵌套、避免循环CURD数据库、优化算法等等。
(2)数据库的优化:(因为数据库优化不是本题重点,因此可选几个主要的来讲)好比启用数据库缓存、经常使用的字段建索引、尽可能避免大事务操做、避免select * 的写法、尽可能不用in和not in 这种耗性能的用法等等。
(3)服务器优化:(这个可做为可选项)负载均衡、Web服务器和数据库分离、UI和Service分离等等。
2、MVC路由理解?(家常便饭)
出现指数:五颗星
主要考点:此题主要考点是MVC路由的理解。
参考答案:
一、首先咱们要理解MVC中路由的做用:url Routing的做用是将浏览器的URL请求映射到特定的MVC控制器动做。
二、当咱们访问http://localhost:8080/Home/Index 这个地址的时候,请求首先被UrlRoutingModule截获,截获请求后,从Routes中获得与当前请求URL相符合的RouteData对象, 将RouteData对象和当前URL封装成一个RequestContext对象,而后从Requestcontext封装的RouteData中获得 Controller名字,根据Controller的名字,经过反射建立控制器对象,这个时候控制器才真正被激活,最后去执行控制器里面对应的 action。
3、谈谈你以为作的不错系统,大概介绍下用到了哪些技术?
出现指数:五颗星
主要考点:这是一道很是开放的面试题。博主遇到过好几家公司的面试官都问道了这个,博主以为他们是想经过这个问题快速了解面试者的技术水平。此题只要结合你最近项目用到的技术谈谈就行了。
参考答案:
就拿我以前作过的一个项目为例来简单说明一下吧。项目分为客户端和服务端,客户端分 为BS客户端和CS客户端,BS客户端采用MVC 5.0的框架,CS客户端是Winform项目,服务端使用WebApi统一提供服务接口,考虑之后可能还要扩展手机端,因此服务接口的参数和返回值使用 通用的Json格式来传递数据。
一、服务端采用的面向接口编程,咱们在软件架构的过程当中,层和层之间经过接口依赖, 下层不是直接给上层提供实现,而是提供接口,具体的实现以依赖注入的方式在运行的时候动态注入进去。MEF就是实现依赖注入的一种组件。它的使用使得UI 层不直接依赖于BLL层,而是依赖于中间的一个IBLL层,在程序运行的时候,经过MEF动态将BLL里面的实现注入到UI层里面去,这样作的好处是减小 了层与层之间的耦合。服务端的异常里面、权限验证、日志记录等通用功能使用了AOP拦截的机制统一管理,项目中使用的是Postsharp这个组件,很好 地将通用需求功能从不相关的类当中分离出来,提升了代码的可维护性。
二、BS的客户端采用的jquery+bootstrap 的方式,全部页面采用流式布局,能更好适应各类不一样的终端设备(PC、手机)。项目中使用了各类功能强大的bootstrap组件,能适应各类复杂的业务需求。
4、Js继承实现。
出现指数:五颗星
主要考点:这道题考验面试者对js理解的深度。根据博主的经历,这种题通常在笔试出现的概率较大,为何把它放在这里,由于它确实太常见了。其实js实现继承的方式不少,咱们只要写好其中一种就行了。
参考答案:原型链继承
5、谈谈你对设计模式的认识?结合你用得最多的一种设计模式说说它的使用。
出现指数:五颗星
主要考点:不用多说,这题考的就是对设计模式的理解。通常为了简单可能会要求你写一个单例模式,注意最好是写一个完整点的,考虑线程安全的那种。而后会让你说说你在项目中什么状况下会用到这种模式
参考答案:
通用写法
单例模式确保一个类只有一个实例,并提供一个全局访问点,它的使用场景好比任务管理 器整个系统中应该只有一个把,再好比操做文件的对象,同一时间咱们只能有一个对象去操做文件吧。最重要的,好比咱们项目中用得很是多的功能→日志记录,在 一个线程中,记录日志的对象应该也只能有一个吧。单例模式的目的是为了保证程序的安全性和数据的惟一性。或者你也能够结合你使用的其余设计模式来讲明。
6、IIS的工做原理?
出现指数:四颗星
主要考点:此题主要考的是.net framework和IIS是如何结合呈现页面的。这是一个有点复杂的过程,面试的时候不可能说得完整,那么咱们就抓住几个关键点说说就能够。其实博主也不能彻底理解这个过程,今天正好借这个机会温习下。
参考答案:
一、当客户端发送HTTP Request时,服务端的HTTP.sys(能够理解为IIS的一个监听组件) 拦截到这个请求;
二、HTTP.sys 联系 WAS 向配置存储中心请求配置信息。
三、而后将请求传入IIS的应用程序池。
四、检查请求的后缀,启动aspnet_isapi.dll这个dll,这个dll是.net framework里面的,也就是说到这一步,请求进入了.net framework的管辖范围。
五、这个时候若是是WebForm,开始执行复杂的页面生命周期(HttpRuntime→ProcessRequest→HttpContext→HttpHandler);若是是MVC,则启动mvc的路由机制,根据路由规则为URL来指定HttpHandler。
六、httpHandler处理请求后,请求结束,给出Response,客户端处理响应,整个过程结束。
7、Http协议
出现指数:四颗星
主要考点:此题主要考对于web里面http协议的理解。
参考答案:
一、http协议是浏览器和服务器双方共同遵循的规范,是一种基于TCP/IP应用层协议。
二、http是一种典型的请求/响应协议。客户端发送请求,请求的内容以及参数存放到请求报文里面,服务端收到请求后,作出响应,返回响应的结果放到响应报文里面。经过F12能够查看请求报文和响应报文。
三、http协议是”无状态”的,当客户端向服务端发送一次http请求后,服务端收到请求而后返回给客户端相应的结果,服务器会当即断开链接并释放资源。在实际开发过程当中,咱们有时须要“保持”这种状态,因此衍生出了Session/Cookie这些技术。
四、http请求的方式主要有get/post。
五、http状态码最好记几个,博主有一次面试就被问到了。200(请求成功)、404(请求的资源不存在)、403(禁止访问)、5xx(服务端错误)
8、数据库优化经验(后端工程师很是常见)
出现指数:四颗星
主要考点:此题考察后端工程师操做数据库的经验。说实话,数据库是博主的弱项,博主以为对于这种考题,须要抓住几个经常使用而且关键的优化经验,若是说得不对,欢迎你们斧正。
参考答案:
一、数据库运维方面的优化:启用数据库缓存。对于一些比较经常使用的查询能够采用数据库缓存的机制,部署的时候须要注意设置好缓存依赖项,防止“过时”数据的产生。
二、数据库索引方面的优化:好比经常使用的字段建索引,联合查询考虑联合索引。(PS:若是你有基础,能够敞开谈谈汇集索引和非汇集索引的使用场景和区别)
三、数据库查询方面的优化:避免select * 的写法、尽可能不用in和not in 这种耗性能的用法等等。
四、数据库算法方面的优化:尽可能避免大事务操做、减小循环算法,对于大数据量的操做,避免使用游标的用法等等。
9、关于代码优化你怎么理解?你会考虑去代码重构吗?
出现指数:四颗星
主要考点:此题考的是面试者对代码优化的理解,以及代码如何重构的相关知识。
参考答案:
一、对于代码优化,以前的公司每周会作代码审核,审核的主要做用就是保证代码的正确性和执行效率,好比减小代码的层级结构、避免循环嵌套、避免循环CURD数据库、尽可能避免一次取出大量数据放在内存中(容易内存溢出)、优化算法等。
二、对于陈旧代码,可能不少地方有调用,而且开发和维护人员颇有可能不是同一我的,因此重构时要格外当心,若是没有十足的把握,不要轻易重构。若是必需要重构,必须作好充分的单元测试和全局测试。
10、谈谈你的优势和缺点?
出现指数:四颗星
主要考点:这道题让人有一种骂人的冲动,可是没办法,恰恰不少所谓的大公司会问这个。好比华为。这个问题见仁见智,答案能够本身组织。
参考答案:
优势:对于新的技术学习能力强,能很快适应新环境等等
缺点:对技术太过于执着等等
11、关于服务器端 MVC 架构的技术实现,您是怎样理解的?这种架构方式有什么好处?您在项目中是如何应用这一架构的?
出现指数:三颗星
主要考点:此题主要考的对于MVC这种框架的理解。
参考答案:MVC,顾名思义,Model、View、Controller。全部的 界面代码放在View里面,全部涉及和界面交互以及URL路由相关的逻辑都在Controller里面,Model提供数据模型。MVC的架构方式会让系 统的可维护性更高,使得每一部分更加专一本身的职责,而且MVC提供了强大的路由机制,方便了页面切换和界面交互。而后能够结合和WebForm的比较, 谈谈MVC如何解决复杂的控件树生成、如何避免了复杂的页面生命周期。
12、网站优化:网站运行慢,如何定位问题?发现问题如何解决?
出现指数:三颗星
主要考点:此题和问题一相似,考察Web的问题定位能力和优化方案。
参考答案:
浏览器F12→网络→查看http请求数以及每一个请求的耗时,找到问题的根源,而后依次解决,解决方案能够参考问题一里面的Web优化方案。
十3、说说你最擅长的技术?并说说你是如何使用的?
出现指数:三颗星
主要考点:这是一道很是开放的面试题。最初遇到这种问题,博主很想来一句:你妹,这叫什么问题!但确实有面试官问到。回头想一想,其实此题考查你擅长的技术的涉及深度。其实博主以为对于这个问题,能够结合你项目中用到的某一个技术来讲就行了。
参考答案:
简单谈谈MEF在咱们项目里面的使用吧。
在谈MEF以前,咱们必需要先谈谈DIP、IOC、DI
依赖倒置原则(DIP):一种软件架构设计的原则(抽象概念)
控制反转(IoC):一种反转流、依赖和接口的方式(DIP的具体实现方式)。
依赖注入(DI):IoC的一种实现方式,用来反转依赖(IoC的具体实现方式)。
什么意思呢?也就是说,咱们在软件架构的过程当中,层和层之间经过接口依赖,下层不是 直接给上层提供实现,而是提供接口,具体的实现以依赖注入的方式在运行的时候动态注入进去。MEF就是实现依赖注入的一种组件。它的使用使得UI层不直接 依赖于BLL层,而是依赖于中间的一个IBLL层,在程序运行的时候,经过MEF动态将BLL里面的实现注入到UI层里面去,这样作的好处是减小了层与层 之间的耦合。这也正是面向接口编程方式的体现。
十4、本身写过JS组件吗?举例说明。
出现指数:三颗星
主要考点:此题考的js组件封装和js闭包的一些用法。通常来讲,仍是笔试出现的概率较大。
参考答案:自定义html的select组件
就能自动从后台取数据,注意valueField和textField对应要显示和实际值。
十5、本身写过多线程组件吗?简要说明!
出现指数:三颗星
主要考点:此题是两年前博主在携程的一次电话面试中遇到的,其余地方基本上没遇到过,其实到如今也不能理解当时面试官问这个问题的目的。但我想,此问题必有出处,估计面试官是想了解你对多线程以及线程池等的理解深度。
参考答案:能够参考http://www.cnblogs.com/Alexander-Lee/archive/2009/10/31/1593647.html
一.填空题
1.面向对象的语言具备(继承)性、(多态)性、(封装)性。
2.能用foreach遍历访问的对象须要实现 (IEnumberable)接口或声明(GetEnumberator)方法的类型。
3.列举ADO.net中的五个主要对象(Command)、(Connection)、(DataReader)、(DataSet)、(DataAdapter)。
4.C#中的三元运算符是__(?:)__
5.当整数a赋值给一个object对象时,整数a将会被__(装箱)___
6.类成员有__(3)__种可访问形式
7.float f=-123.567F;int i=(int)f;i的值如今是_(-123)__
8.委托声明的关键字是___( delegate) _
9.在Asp.net中全部的自定义用户控件都必须继承自_ (System.Web.UI.UserControl) __
10.在.Net中全部可序列化的类都被标记为__[serializable]___
11.在.Net托管代码中咱们不用担忧内存漏洞,这是由于有了_ GC __
12.当类T只声明了私有实例构造函数时,则在T的程序文本外部,_不能够_(能够 or 不能够)从T派生出新的类,_不能够_(能够 or 不能够)直接建立T的任何实例。
二.选择题
1.如下叙述正确的是: BC
A. 接口中能够有虚方法。 B. 一个类能够实现多个接口。
C. 接口不能被实例化。 D. 接口中能够包含已实现的方法。
2.从数据库读取记录,你可能用到的方法有: BCD
A. ExecuteNonQuery B. ExecuteScalar
C. Fill D. ExecuteReader
3.对于一个实现了IDisposable接口的类,如下哪些项能够执行与释放或重置非托管资
相关的应用程序定义的任务?(多选) ( ABC )
A.Close B.Dispose C.Finalize D.using E.Quit
4.如下关于ref和out的描述哪些项是正确的?(多选) ( ACD )
A.使用ref参数,传递到ref参数的参数必须最早初始化。
B.使用out参数,传递到out参数的参数必须最早初始化。
C.使用ref参数,必须将参数做为ref参数显式传递到方法。
D.使用out参数,必须将参数做为out参数显式传递到方法。
5.在对SQL Server 数据库操做时应选用(A)
A.SQL Server .NET Framework 数据提供程序;
B.OLE DB .NET Framework 数据提供程序;
C.ODBC .NET Framework 数据提供程序;
D.Oracle .NET Framework数据提供程序;
6.下列选项中,(C)是引用类型。
A.enum类型 B.struct类型 C.string类型 D.int类型
7.关于ASP.NET中的代码隐藏文件的描述正确的是(C)
A.Web窗体页的程序的逻辑由代码组成,这些代码的建立用于与窗体交互。编程逻辑惟一与用户界面不一样的文件中。该文件称做为“代码隐藏”文件,若是用C#建立,该文件将具备“.ascx.cs”扩展名。
B.项目中全部Web窗体页的代码隐藏文件都被编译成.EXE文件。
C.项目中全部的Web窗体页的代码隐藏文件都被编译成项目动态连接库(.dll)文件。
D.以上都不正确。
8.如下描述错误的是(A)
A.在C++中支持抽象类而在C#中不支持抽象类。
B.C++中可在头文件中声明类的成员而在CPP文件中定义类的成员,在C#中没有头文件而且在同一处声明和定义类的成员。
C.在C#中可以使用 new 修饰符显式隐藏从基类继承的成员。
D.在C#中要在派生类中从新定义基类的虚函数必须在前面加Override。
9.C#的数据类型有(B)
A.值类型和调用类型 B.值类型和引用类型
C.引用类型和关系类型 D.关系类型和调用类型
10.下列描述错误的是(D)
A.类不能够多重继承而接口能够
B.抽象类自身能够定义成员而接口不能够
C.抽象类和接口都不能被实例化
D.一个类能够有多个基类和多个基接口
11.在DOM中,装载一个XML文档的方法(D)
A.save方法 B.load方法 C.loadXML方法 D.send方法
12.下列关于构造函数的描述正确的是(C)
A.构造函数能够声明返回类型。
B.构造函数不能够用private修饰
C.构造函数必须与类名相同
D.构造函数不能带参数
13.如下是一些C#中的枚举型的定义,其中错误的用法有(A)
A.public enum var1{ Mike = 100, Nike = 102, Jike }
B.public enum var1{ Mike = 100, Nike, Jike }
C.public enum var1{ Mike=-1 , Nike, Jike }
D.public enum var1{ Mike , Nike , Jike }
14.int[][] myArray3=new int[3][]{new int[3]{5,6,2},new int[5]{6,9,7,8,3},new int[2]{3,2}}; myArray3[2][2]的值是(D)
A.9 B.2 C.6 D.越界
15.接口是一种引用类型,在接口中能够声明(A),但不能够声明公有的域或私有的成员变量
A..方法、属性、索引器和事件 B.方法、属性信息、属
C.索引器和字段 D.事件和字段;
16.ASP.NET框架中,服务器控件是为配合Web表单工做而专门设计的。服务器控件有两种类型,它们是(A )
A.HTML控件和Web控件 B.HTML控件和XML控件
C.XML控件和Web控件 D.HTML控件和IIS控件
17.ASP.NET中,在Web窗体页上注册一个用户控件,指定该控件的名称为”Mike”,正确的注册指令为( D)
A.<%@Register TagPrefix = “Mike” TagName = “Space2” Src = “myX.ascx”%>
B.<%@Register TagPrefix = “Space2” TagName = “Mike” Src = “myX.ascx”%>
C.<%@Register TagPrefix = “SpaceX” TagName = “Space2” Src = “Mike”%>
D.以上皆非
18.在ADO.NET中,对于Command对象的ExecuteNonQuery()方法和ExecuteReader()方法,下面叙述错误的是(C)
A.insert、update、delete等操做的Sql语句主要用ExecuteNonQuery()方法来执行;
B.ExecuteNonQuery()方法返回执行Sql语句所影响的行数。
C.Select操做的Sql语句只能由ExecuteReader()方法来执行;
D.ExecuteReader()方法返回一个DataReder对象;
19.下列ASP.NET语句(B)正确地建立了一个与SQL Server 2000数据库的链接。
A. SqlConnection con1 = new Connection(“Data Source = localhost; Integrated Security = SSPI; Initial Catalog = myDB”);
B. SqlConnection con1 = new SqlConnection(“Data Source = localhost; Integrated Security = SSPI; Initial Catalog = myDB”);
C. SqlConnection con1 = new SqlConnection(Data Source = localhost; Integrated Security = SSPI; Initial Catalog = myDB);
D. SqlConnection con1 = new OleDbConnection(“Data Source = localhost; Integrated Security = SSPI; Initial Catalog = myDB”);
20.Winform中,关于ToolBar控件的属性和事件的描述不正确的是(D)
A.Buttons属性表示ToolBar控件的全部工具栏按钮
B.ButtonSize属性表示ToolBar控件上的工具栏按钮的大小,如高度和宽度
C.DropDownArrows属性代表工具栏按钮(该按钮有一列值须要如下拉方式显示)旁边是否显示下箭头键
D.ButtonClick事件在用户单击工具栏任何地方时都会触发
21.在ADO.NET中执行一个存储过程时,若是要设置输出参数则必须同时设置参数的方向和(D ),必要时还要设置参数尺寸。
A.大小; B.上限; C.初始值; D.类型
22.若是将窗体的FormBoderStyle设置为None,则( A)。
A.窗体没有边框并不能调整大小; B.窗体没有边框但能调整大小;
C.窗体有边框但不能调整大小; D.窗体是透明的;
23.若是要将窗体设置为透明的,则( B)
A.要将FormBoderStyle属性设置为None; B.要将Opacity属性设置为小于100%的值;
C.要将locked 属性设置为True; D.要将 Enabled属性设置为True;
24.下列关于C#中索引器理解正确的是(B/C )
A.索引器的参数必须是两个或两个以上 B.索引器的参数类型必须是整数型
C.索引器没有名字 D.以上皆非
25.下面描述错误的是( C/D)
A.窗体也是控件; B.窗体也是类; C.控件是从窗体继承来的;D.窗体的父类是控件类
26.要对注册表进行操做则必须包含( D)
A.System.ComponentModel命名空间;B.System.Collections命名空间;
C.System.Threading命名空间; D.Microsoft.Win32命名空间;
27.要建立多文档应用程序,须要将窗体的(D )属性设为true。
A.DrawGrid; B.ShowInTaskbar; C.Enabled; D.IsMdiContainer;
28.若是设treeView1=new TreeView(),则treeView1.Nodes.Add("根节点")返回的是一个 (A)类型的值。
A.TreeNode; B.int; C.string; D.TreeView;
29.下面关于XML的描述错误的是(D)
A.XML提供一种描述结构化数据的方法;
B.XML 是一种简单、与平台无关并被普遍采用的标准;
C.XML文档可承载各类信息;
D.XML只是为了生成结构化文档;
30.装箱、拆箱操做发生在: ( C )
A.类与对象之间 B.对象与对象之间
C.引用类型与值类型之间 D.引用类型与引用类型之间
31.用户类若想支持Foreach语句须要实现的接口是: ( A )
A.Ienumerable B.Ienumerator C.Icollection D.IcollectData
32.Net Framework经过什么与COM组件进行交互操做?( C )
A.Side By Side B.Web Service C.Interop D.PInvoke
33..Net依靠如下哪一项技术解决COM存在的Dll Hell问题的?( A )
A.Side By Side B.Interop C.Pinvoke D.COM+
34.装箱与拆箱操做是不是互逆的操做?( B )
A.是 B.否
35.如下哪一个是能够变长的数组?( D )
A.Array B.string[] C.string[N] D.ArrayList
36.用户自定义异常类须要从如下哪一个类继承:( A )
A.Exception B.CustomException C.ApplicationException D.BaseException
在此提醒下,本文适合:
文章引用:http://www.cnblogs.com/jiajiayuan/archive/2011/09/16/2178462.html
接口中的方法用来定义对象之间通讯的契约,指定接口中的方法为私有或保护没有意义。它们默认为公有方法。
interface IProgram { void Fun(); } class Program:IProgram { //显式实现接口成员 void IProgram.Fun() { Console.WriteLine("I am Fun."); } staticvoid Main(string[] args) { IProgram p =new Program(); //声明一个接口实例,但不是对接口进行实例化 p.Fun(); Console.Read(); } }
通常状况,当类或者结构要实现的是单个接口,能够使用隐式实现。
若是类或者结构继承了多个接口且接口中具备相同名称成员时,就要用到显式实现,当显式实现方式存在时,隐式实现方式就失效了。
interface IProgram { void Fun(); } interface IAProgram { void Fun(); } class Program : IProgram, IAProgram { void IProgram.Fun() //显式实现接口IProgram { Console.WriteLine("I am IProgram Fun."); } void IAProgram.Fun() //显式实现接口IAProgram { Console.WriteLine("I am IAProgram Fun."); } //public void Fun() //隐式实现接口 //{ // Console.WriteLine("I am Program Fun."); //} staticvoid Main(string[] args) { //IProgram p = new Program(); //p.Fun(); //IAProgram ap = new Program(); //ap.Fun(); Program pro =new Program(); ((IProgram)pro).Fun(); ((IAProgram)pro).Fun(); Console.Read(); } }
接口继承和类继承不一样
interface IProgram { void Fun(); } interface IAProgram:IProgram { } class Program : IAProgram { void IProgram.Fun() { Console.WriteLine("I am IProgram Fun."); } static void Main(string[] args) { Program pro =new Program(); ((IAProgram)pro).Fun(); Console.Read(); } }
因为接口的实现没有方法体,抽象方法也没有方法体,那么当咱们在接口的实现方法里调用抽象方法时,会如何执行呢?
interface IProgram { void Fun(); } abstract class AProgram : IProgram { public abstract void AFun(); void IProgram.Fun() { AFun(); } } class Program:AProgram { public override void AFun() { Console.WriteLine("I am AProgram."); } static void Main(string[] args) { IProgram pro =new Program(); pro.Fun(); Console.Read(); } } //结果:I am Aprogram.
经过断点,能够看到,当执行pro.Fun();时,首先会跳到接口的实现方法里,而后去调用抽象函数的实现方法,当抽象函数的方法实现后,再回到接口的实现方法,直到执行完成。
当咱们在实现接口的方法里调用虚函数呢?
interface IProgram { void Fun(); } class AProgram : IProgram { public virtual void AFun() //注意这里是虚函数 { Console.WriteLine("I am virtual AFun."); } void IProgram.Fun() { AFun(); } } class Program:AProgram { public override void AFun() //这里是Override重写 { Console.WriteLine("I am override AFun."); } static void Main(string[] args) { IProgram pro =new Program(); pro.Fun(); Console.Read(); } }
这时,咱们发现,执行的顺序和上一个例子是相同的。因此结果为:I am override AFun.
由此,咱们能够继续联想,当咱们把override关键字,换成new呢?是否是也是一样的结果,仍是和咱们之前讲的例子同样,是隐藏呢?
咱们把上面的例子进行改进:
interface IProgram { void Fun(); } class AProgram : IProgram { public virtual void AFun() { Console.WriteLine("I am virtual AFun."); } void IProgram.Fun() { AFun(); } } class Program:AProgram { public new void AFun() { Console.WriteLine("I am new AFun."); } static void Main(string[] args) { Program pro =new Program(); ((IProgram)pro).Fun(); pro.AFun(); Console.Read(); } }
结果为:
I am virtual AFun.
I am new AFun.
因为前面已经讲过了==,这里不在对此进行分析,由此咱们可知使用New关键字是对其进行隐藏,当对接口实现的方法里调用的是虚方法时,和类的执行过程是同样的。
异:
同:
简述:简单的说,一个是同一个函数的几种形式,一个是重写父类函数。
重载:当类包含两个名称相同但签名不一样(方法名相同,参数列表不相同)的方法时发生方法重载。用方法重载来提供在语义上完成相同而功能不一样的方法。
覆写:在类的继承中使用,经过覆写子类方法能够改变父类虚方法的实现。
区别:
简述:值类型包括简单类型、结构体类型和枚举类型,引用类型包括自定义类、数组、接口、委托等
每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。
值类型主要由两类组成:结构、枚举
①. 结构分为如下几类:Numeric(数值)类型、整型、浮点型、decimal、bool、用户定义的结构。
②. 引用类型的变量又称为对象,可存储对实际数据的引用。声明引用类型的关键字:class、interface、delegate、内置引用类型: object、string
值类型存贮在栈中,而引用类型存贮在动态的堆中,栈是先进先出的有系统管理的空间,而堆是由应用程序控制的可随时申请和释放该空间,在Donnet中通常状况下有垃圾收集器处理,他们的不一样致使在编程上的不一样。
例:
using System; using System.Text; class EventDel { static void Main(string[] args) { StringBuilder a=new StringBuilder();//将StringBuilder的一个首地址传给a StringBuilder b=a; //将StringBuilder的一个首地址传给b b.Append("mxh"); Console.WriteLine(a); a=null; Console.WriteLine(b); } }
"a=null"的意思是:a的引用置为空但此时StringBuilder的堆空间并无被释放,所以在此以后,输出b时,仍然能够输出mxh
输出结果:
mxh
mxh
参考资料 :
C# 知识回顾 - 委托 delegate
委托是一种安全的函数指针,事件是一种消息机制
委托提供了封装方法的方式,事件是某动做已发生的说明,事件是创建于委托之上的。
程序运行时同一个委托可以用来调用不一样的方法,只要改变它的引用方法便可,所以委托调节器用的方法不是在编译时决定的,而是在运行时肯定的.
在ASP.NET中,有不少种保存信息的内置对象,如:Application,Session,Cookie,ViewState和Cache等。下面分别介绍它们的用法和区别。
Application用于保存全部用户的公共的数据信息,若是使用Application对象,一个须要考虑的问题是任何写操做都要在Application_OnStart事件(global.asax)中完成.尽管使用Application.Lock和Applicaiton.Unlock方法来避免写操做的同步,可是它串行化了对Application对象的请求,当网站访问量大的时候会产生严重的性能瓶颈.所以最好不要用此对象保存大的数据集合. 下面咱们作个在线用户统计的例子来讲明这个问题:
Global.asax类
代码
using System; using System.Collections; using System.ComponentModel; using System.Web; using System.Web.SessionState; using System.IO; /// Global 的摘要说明。 public class Global : System.Web.HttpApplication { /// 必需的设计器变量。 private System.ComponentModel.IContainer components = null; private FileStream fileStream; private StreamReader reader;//读字符流 private StreamWriter writer;//写字符流 public Global() { InitializeComponent(); } protected void Application_Start(Object sender, EventArgs e) { Application["CurrentGuests"]=0;//初始花为0; fileStream = File.Open(Server.MapPath("counts.text"),FileMode.OpenOrCreate);//文件不存在,建立文件 reader = new StreamReader(fileStream);//要读取的完整路径 Application["AllGuests"] = Convert.ToInt32(reader.ReadLine()); //从当前流中读取一行字符并将数据做为字符串返回 reader.Close();//关闭流 } protected void Session_Start(Object sender, EventArgs e)//当用户访问网站时,在线用户+1,总访问数+1 { Application.Lock();//同步,避免同时写入 Application["CurrentGuests"] =(int)Application["CurrentGuests"]+ 1;//总在线用户数 Application["AllGuests"] =(int)Application["AllGuests"]+ 1;//访问网站的总用户数 fileStream = new FileStream(Server.MapPath("counts.text"),FileMode.OpenOrCreate,FileAccess.ReadWrite);// writer = new StreamWriter(fileStream);//实现一个写入流,使其以一种特定的编码向流中写入字符 writer.WriteLine(Application["AllGuests"].ToString());//把访问网站的总用户数再次写入到文件 writer.Close();//关闭写入流 Application.UnLock();//同步结束 } protected void Session_End(Object sender, EventArgs e)//当前用户退出网站时,在线用户数量-1, { Application.Lock(); Application["CurrentGuests"] =(int)Application["CurrentGuests"] - 1;//总在线用户数量-1 Application.UnLock(); } (2) WebForm1.aspx private void Page_Load(object sender, System.EventArgs e) { this.Label1.Text = "正在访问站点的用户数:" + Application["CurrentGuests"].ToString(); this.Label2.Text ="访问过站点的总用户数:" + Application["AllGuests"].ToString(); }
Session用于保存每一个用户的专用信息.每一个客户端用户访问时,服务器都为每一个用户分配一个惟一的会话ID(Session ID) . 她的生存期是用户持续请求时间再加上一段时间(通常是20分钟左右).Session中的信息保存在Web服务器内容中,保存的数据量可大可小.当Session超时或被关闭时将自动释放保存的数据信息.因为用户中止使用应用程序后它仍然在内存中保持一段时间,所以使用Session对象使保存用户数据的方法效率很低.对于小量的数据,使用Session对象保存仍是一个不错的选择.使用Session对象保存信息的代码以下:
//存放信息 Session["key"]="value" //读取数据 string UserName=Session["key"].ToString();
Cookie用于保存客户浏览器请求服务器页面的请求信息,程序员也能够用它存放非敏感性的用户信息,信息保存的时间能够根据须要设置.若是没有设置Cookie失效日期,它们仅保存到关闭浏览器程序为止.若是将Cookie对象的Expires属性设置为Minvalue,则表示Cookie永远不会过时.Cookie存储的数据量很受限制,大多数浏览器支持最大容量为4K,所以不要用来保存数据集及其余大量数据.因为并不是全部的浏览器都支持Cookie,而且数据信息是以明文文本的形式保存在客户端的计算机中,所以最好不要保存敏感的,未加密的数据,不然会影响网站的安全性.使用Cookie对象保存的代码以下:
//存放信息 Response.Cookies["key"].Value="value"; //读取信息 string UserID=Response.Cookies["key"].Value;
ViewState 经常使用于保存单个用户的状态信息,有效期等于页面的生存期。跟隐藏控件类似。viewstate是在本页面以内各函数间进行传值的 , 至于为何要使用这种方法是由于在一个事件发生以后 , 页面可能会刷新 , 若是定义全局变量会被清零 , 因此要使用viewstate. ViewState容器能够保持大量的数据,可是必须谨慎使用,由于过多使用会影响应用程序的性能。全部Web服务器控件都使用ViewState在页面回发期音保存本身的状态信息。若是某个控件不须要在回发期间保存状态信息,最好关闭该对象的ViewState,避免没必要要的资源浪费。经过给@Page指令添加“EnableViewState=false”属性能够禁止整个页面的ViewState。使用ViewState对象保存信息的代码以下。
//存放信息 ViewState["key"]="value"; //读取信息 string NameID=ViewState["nameID"].ToString();
Cache对象用于在HTTP请求间保存页面或数据。该对象的使用能够极大地提升整个应用程序的效率。经常使用于将频繁访问的大量服务器资源存储在内存中,当用户发出相同的请求后服务器再也不次处理而是将Cache中保存的信息返回给用户,节省了服务器处理请求的时间。其生存期依赖于该应用程序的生存期。当从新启动应用程序时,将从新建立其Cache对象的实例。使用Cache对象保存信息的代码以下。
//存放信息
Cache["nameID"]="0001"; //存放信息 Cache.Insert("nameID","0001"1); //读取信息 string NameID=Cache["nameID"].ToString();
Hidden控件是属于HTML类型的服务器控件,使用此控件能够实现隐藏域的功能。其实此控件和其它服务器控件的使用没有太大区别,只是它不会在用户端的浏览器中显示,始终处于隐藏状态。可是每次页面提交的时候,此控件和其它服务器控件一同提交到服务器端,所以在服务器端能够使用Value属性获取或保存一些数据信息。使用Hidden控件保存信息的代码以下。
//存放信息 Hidden.Value="0001"; //获取信息 string NameID=Hidden.Value;
查询字符串的方式是将要传递的值链接在URL后面,而后经过Response.Redirect方法实现客户端的重定向。这种方式能够实如今两个页面之间传递信息。因为URL的长度有必定的限制,所以不能传递太大的信息,加外安全性也不是很好。
传递信息以下。问号后面格式 key1=value1&key2=value2
Response.Redirect("List.aspx?nameID=0001&gradeID=002"); //执行上面的语句后在IE地址栏显示的URL的代码以下。 http://localhost/List.aspx?nameID=0001&grade=002 //当跳转到List.aspx后,能够经过如下代码得到所传递的信息。 string NameID.GradeID;
简述: Ajax的原理就是:经过javascript的方式,将前台数据经过xmlhttp对象传递到后台,后台在接收到请求后,将须要的结果,再传回到前台,这样就能够实现不须要页面的回发,页是数据实现来回传递,从页实现无刷新。
Ajax的原理简单来讲,实际上就是经过XmlHttpRequest对象来向服务器发异步请求,从服务器得到数据,而后用javascript来操做DOM而更新页面。
这其中最关键的一步就是从服务器得到请求数据。要清楚这个过程和原理,咱们必须对 XMLHttpRequest有所了解。
总结:咱们能够看出,XMLHttpRequest对象彻底用来向服务器发出一个请求的,它的做用也局限于此,但它的做用是整个ajax实现的关键,咱们能够把服务器端当作一个数据接口,它返回的是一个纯文本流,固然,这个文本流能够是XML格式,能够是Html,能够是Javascript代码,也能够只是一个字符串。这时候,XMLHttpRequest向服务器端请求这个页面,服务器端将文本的结果写入页面,这和普通的web开发流程是同样的,不一样的是,客户端在异步获取这个结果后,不是直接显示在页面,而是先由javascript来处理,而后再显示在页面。
属性 | 索引器 |
---|---|
经过名称标识 | 经过签名标识 |
经过简单名称或成员访问来访问 | 经过元素访问来访问 |
能够为静态成员或实例成员 | 必须为实例成员 |
属性的get访问器没有参数 | 索引器的get访问器具备与索引器相同的形参表 |
属性的set访问器包含隐式value参数器 | 除了value参数外,索引的 set 访问器还具备与索引器相同的形参表 |
若是要操做一个不断增加的字符串,尽可能不用String类,改用StringBuilder类
String类原理:String类是一种传统的修改字符串的方式,它确实能够完成把一个字符串添加到另外一个字符串上的工做没错,可是在.NET框架下,这个操做实在是划不来。由于系统先是把两个字符串写入内存,接着删除原来的String对象,而后建立一个String对象,并读取内存中的数据赋给该对象。这一来二去的,耗了很多时间。
StringBulider原理:而使用 System.Text命名空间下面的StringBuilder类就不是这样了,它提供的Append方法,可以在已有对象的原地进行字符串的修改,简单并且直接。
提醒:通常状况下觉察不到这两者效率的差别,但若是你要对某个字符串进行大量的添加操做,那么StringBuilder类所耗费的时间和 String类简直不是一个数量级的
枚举类型是一种的值类型,它用于声明一组命名的常数。
访问修辞符 enum 枚举名:基础类型 { 枚举成员 }
基础类型必须可以表示该枚举中定义的全部枚举数值。枚举声明能够显式地声明 byte、sbyte、short、ushort、int、uint、long 或 ulong 类型做为对应的基础类型。没有显式地声明基础类型的枚举声明意味着所对应的基础类型是 int。
枚举成员是该枚举类型的命名常数。任意两个枚举成员不能具备相同的名称。每一个枚举成员均具备相关联的常数值。此值的类型就是枚举的基础类型。每一个枚举成员的常数值必须在该枚举的基础类型的范围以内。
public enum TimeofDay:uint { Morning=-3, Afternoon=-2, Evening=-1 }
产生编译时错误,缘由是常数值 -一、-2 和 –3 不在基础整型 uint 的范围内。
在枚举类型中声明的第一个枚举成员它的默值为零。
之后的枚举成员值是将前一个枚举成员(按照文本顺序)的值加 1 获得的。这样增长后的值必须在该基础类型可表示的值的范围内;不然,会出现编译时错误。
示例:
public enum TimeofDay:uint { Morning, Afternoon, Evening }
Morning的值为0,Afternoon的值为1,Evening的值为2。
容许多个枚举成员有相同的值。没有显示赋值的枚举成员的值,老是前一个枚举成员的值+1
public enum Number { a=1, b, c=1, d }
b的值为2,d的值为2.
注意:以上枚举值都不能超过它的基础类型范围。不然会报错.
基础类型不能隐式转换为枚举类型; 枚举类型也不能隐式转换为基础类型
public enum Number { a, b, c, d } class Test { public static void Main() { int i=Number.a;//错误,要强制类型转换(int)Number.a Number n; n=2 //错误,要强制类型转换(Number)2 } }
using System;
public enum TimeofDay { Morning, Afternoon, Evening } class Test { static void WriteGreeting(TimeofDay timeofDay) { switch(timeofDay) { case TimeofDay.Morning: Console.WriteLine("good morning"); break; case TimeofDay.Afternoon: Console.WriteLine("good afternoon"); break; case TimeofDay.Evening: Console.WriteLine("good evening"); break; } } static void Main() { WriteGreeting(TimeofDay.Morning); WriteGreeting(TimeofDay.Evening); WriteGreeting(TimeofDay.Afternoon); } }
例:int myInt=new int();
myInt初始化为0,它是int类型的默认值。该语句的效果等同于:intmyInt=0;
使用new修饰符显式隐藏从基类继承的成员。若要隐藏继承的成员,请使用相同名称在派生类中声明该成员,并用new修饰符修饰它。
请看下面的类:
public class MyClass { public int x; public void Invoke(){} }
在派生类中用Invoke名称声明成员会隐藏基类中的Invoke方法,即:
public class MyDerivedC:MyClass { new public void Invoke(){} }
可是,由于字段x不是经过相似名隐藏的,因此不会影响该字段。
经过继承隐藏名称采用下列形式之一:
1.引入类或结构中的常数、指定、属性或类型隐藏具备相同名称的全部基类成员。
2.引入类或结构中的方法隐藏基类中具备相同名称的属性、字段和类型。同时也隐藏具备相同签名的全部基类方法。
3.引入类或结构中的索引器将隐藏具备相同名称的全部基类索引器。
4.在同一成员上同时使用new和override是错误的。
注意:在不隐藏继承成员的声明中使用new修饰符将生成警告。
示例:在该例中,嵌套类MyClass隐藏了基类中具备相同名称的类。该例不只说明了如何使用彻底限定名访问隐藏类成员,同时也说明了如何使用new修饰符消除警告消息。
using System; public class MyBaseC { public class MyClass { public int x=200; public int y; } } public class MyDerivedC:MyBaseC { new public class MyClass //nestedtypehidingthebasetypemembers { public int x=100; public int y; public int z; } public static void Main() { //Creating object from the overlapping class: MyClass S1=new MyClass(); //Creating object from the hidden class: MyBaseC.MyClass S2=new MyBaseC.MyClass(); Console.WriteLine(S1.x); Console.WriteLine(S2.x); }
输出:
100
200
基础题:
1.简述List与string[]的区别。
2.简述装箱和拆箱操做中的性能损耗是如何产生的。
3.简述对ASP.NET中的事件机制的理解。
4.在一个ASP.NET的三层结构系统中,以登陆操做为例,简述在各层中如何组织代码。
5.简述相比DATASET,实体类在WEB项目中的优势与缺点。
6.简述GC是如何工做的。
7.简述3个熟悉的设计模式。
8.简述UDP协议特色,以及如何提升UDP传输可靠性。
9.简述.NET2.0,.NET3.0,.NET3.5各版本中推出的新特性。
算法题:(如下三题不用做答,想好思路面试谈便可)
1. 一个整数数列,元素取值多是0~65535中的任意一个数,相同数值不会重复出现。0是例外,能够反复出现。
请设计一个算法,当你从该数列中随意选取5个数值,判断这5个数值是否连续相邻。
注意:
- 5个数值容许是乱序的。好比: 8 7 5 0 6
- 0能够通配任意数值。好比:8 7 5 0 6 中的0能够通配成9或者4
- 0能够屡次出现。
- 复杂度若是是O(n2)则不得分。
2. 设计一个在一百万个数字中求十个最大的数算法
3. 有以下输入:若干个由大写英文字母构成的单词,以’,’号隔开。如“ABCCD,CDA,BCDD,DCA,ADC,BCD,CDCAB”。 写一段程序,从输入中寻找由相同字符构成(重复字符出现次数也是同样)的单词组输出。
如以上输入,则输出:
第1组:ABCCD,CDCAB
第2组:CDA,DCA,ADC
项目&管理:(如下两题不用做答,想好思路面试谈便可)
1.假设你作为一个开发团队的领导者,通过长时间的磨合,有了一只10人左右的不错的团队。其中每一个成员都在其职位上有不可或缺的做用。现因为一些缘由,须要你辞退其中一人。你会如何处理这件事情?
2.有一套公司本身开发供本公司使用的CRM系统,其中的权限控制过于简单。现须要你从新设计其权限系统,你会如何开展这个工做?
非技术(面谈):
1.在上份工做中,本身体现最大的优势和缺点是什么。
一、学校几本(是否统招)、英语等级、大学成绩排名Top%几、当前月薪(入职前是否能提供薪资证实材料)、指望月薪
二本,统招
英语四级
排名top10
二、作过的项目技术栈是什么?(例如 .NET、Sql Server、Dapper、EF、Redis……)
.NET、C#、EF、MVC、SQL Server、Oracle、WebService、API、SDK、Redis、JPush、Lucene.Net
Html、css、JavaScript、Ajax、Jquery、AngularJS、Bootstrap
iOS、Objective-C、Winforms、WPF
三、作过的项目中最大的表数据量大概多少?业务高峰期每分钟并发请求数量大概多少?遇到的最大技术难点与解决方案,研究过的.NET开源项目,举例说明3-5个
最大的表有200万条数据,数据查询出现慢的状况,优化方案:在条件语句的列上加索引;优化SQL避免like,in、not in等;使用分页临时表避免全表扫描;
高峰期每分钟并发请求2千左右;
技术难点:团队创立初期,APP刚刚上线,功能在逐步完善。当时为了推广拉新,想开发一个功能,实现APP的在微信里的传播分享。网站享用的是微信开放平台的网站应用号受权,还有另外一块是微信公众平台公众号分享,分别是不一样的两套APPID,受权以后会获取到两个不一样的OpenID,但愿用户信息打通,用户只要受权过一次以后就能在另外一个模块实现免登录。因为当时一心想经过业务存储两个不一样的OpenID的关联关系,作到统一,结果走了很多弯路,仍然达不到想要的效果。
解决方案:UnionID,将两个帐号在后台关联以后就能获取到统一的UnionID,业务记录此ID便可。
开源项目
Json.net Json序列化和反序列化,基本支持全部的json特性,性能也很好,MVC4的默认引用程序集中已包含.
Log4net 传统的日志框架,移植于log4jV1.2,高效,稳定
Html Agility Pack Html解析库
DotNetZip 建立,压缩,解压Zip文件
DotNetCodes 一些经常使用的功能性代码Utilities,能够减小许多开发时间,并且类与类之间没有什么依赖,每一个类均可以单独拿出来使用,excel导出、二维码生成、网络请求等;
四、.NET系统如何实现水平扩展、如何解决高并发问题,解决方案思路
应用服务和数据服务分离:把网站分为应用服务器、文件服务器和数据库服务器,不一样服务器承担不一样角色,从而提成网站处理能力和文件存储能力;
数据库读写分离:经过配置主从服务器实现数据库读写分离,改善数据库负载压力;
业务拆分:根据产品线拆分,例如订单、商铺、买家等,分归不一样业务团队管理,不一样业务分不一样物理服务器处理,能够经过消息队列进行数据分发;
使用NoSQL和搜索引擎:应用服务器经过统一模块访问各类数据,减轻应用程序管理数据源的麻烦;
应用服务器集群:经过负载均衡使一批设备共同对外提供服务,由统一调度服务器经过调度策略进行分发,当有服务器宕机时,调度服务器会将请求转移到其余服务器上,保证不影响用户使用;
分布式文件系统和分布式数据库系统:将业务拆分红不一样模块,不一样业务的数据库放在不一样的物理服务器上;
缓存:包括本地缓存、分布式缓存、反向代理和CDN加速;
使用缓存改善网站性能:把业务常常访问的数据缓存到内存中,能够大大减小数据库的读取访问压力,从而改善写入性能,方式有本地缓存和分布式服务器缓存,部署大内存服务器;
反向代理和CDN加速:基本原理都是缓存,用户请求服务时,经过距离判断最近机房代理服务器中缓存这用户请求的资源,直接返回给用户,减轻后端服务器负载压力;
异步操做:典型的生产者消费者模式,二者不存在直接调用,只要保持数据结构不便,彼此功能实现能够随意变化而不互相影响;
固态硬盘代替机械硬盘:使用SSD,物理设备上加快文件访问速度;
五、国内外基于.NET技术的知名网站有哪些,.NET与Java相比有哪些优势、缺点,如何看待微软全新一代.NET Core开源、免费、跨平台的将来发展前景
.NET知名网站
国外:microsoft、stackoverflow、codeproject、myspace、Godaddy、msn、
国内:cnblogs、csdn、智联、携程、必应、起点、凡客
.NET和java对比
开源和跨平台,Java一直开源跨平台,有很是丰富的社区资源;微软14年也宣布开源跨平台,有.NET Core、xamarin,微软正在努力,但作到Java如今的程度我的以为还有很长一段路要走。
编程工具,C#有好用的IDE Visual Studio;Java之前有eclipse,如今有Intellij。
语言特性,二者语法相似,C#feature更多(语言特性,泛型、委托、重载运算符、LINQ、lambda、delegate、扩展等),语法糖也更多,程序员基本能够专一逻辑而不用关注如何实现;而Java这块比较贫乏。
更新速度,C#由微软维护,版本更新快,支持更多新特性;java版本更新慢。
应用领域,C#目前主要应用在windows的PC应用,unitity3D,web。Java应用于web,Android,Hadoop等。
生态环境,我的认为最重要的一点。开源库和框架Java数不胜数,各类层面的解决方案眼花缭乱,C# web比较好用的框架只有asp .net、MVC。
.NET Core将来发展前景
我的看好 .Net Core 的将来发展前景。
.NET Core是一个开源通用的开发框架,支持跨平台,即支持在Window,macOS,Linux等系统上的开发和部署,而且能够在硬件设备,云服务,和嵌入式/物联网方案中进行使用。首先从Core的定位上来讲,他摒弃了原有AspNet的那些臃肿组件,面向高性能服务器开发。虽然如今版本功能还比较弱,各种三方库支持也没有更新,可是这只是时间问题,以微软的更新速度和推广力度,几年后必将完善。
基于微软的 Azure 云的平台优点,后期势必会加入 .Net Core 的支持,加上微软的跨平台战略,对 Docker 的亲和性,对于开发人员也很是友好,因此总体环境来讲是健康发展的,将来技术决策时 .Net Core 也有很大的优点。
所以将来其发展主要看的就是微软推广力度及社区开发者的支持度。
喜欢C#就会一直坚持下去,由于兴趣是最好的老师。
六、www.dot.net官网任选一篇英文技术文章,不用单词软件大概能看懂百分之多少?
看了一篇教学文章
https://www.microsoft.com/net/tutorials/csharp/getting-started/hello-world
所有英文文档大概能看懂百分之80
七、咱们会根据以上信息进行岗位匹配度的评估(教育背景、技术能力、抽象总结能力……),节省应聘者的面试成本,提高招聘效率
八、为了方便及时沟通,请加技术经理微信 2531685528 注明:应聘.NET 姓名
-------------------------------------------------------
【.NET技术面试参考资料、图书】
一、《大型网站技术架构》
二、《Sql Server性能优化与管理的艺术》
三、《跟阿铭学Linux》
四、《深刻浅出MySQL数据库开发优化与管理维护》
五、《微服务设计》
参考资料共享地址
http://pan.baidu.com/s/1nvUc1nz
http://www.apelearn.com/study_v2/