引言
今天继续的是去那几家面试公司的一些面试题目,适合刚出来或者两三年经验的,大牛可以适量吐槽下,找工作的可以补补基础。
这系列文章请查看这里:
- 最近找工作面的面试题目汇总(一)
- 最近找工作面的面试题目汇总(二)
11.interface是否可继承interface?abstract class 是否可实现interface
回答1:接口可以继承接口,而且可以继承多个接口,用“,”进行分割,接口不允许直接或间接地从自身继承。和类的继承相似,接口的继承也形成接口之间的层次结构
回答2:抽象类是可以实现接口的,抽象类里可以有抽象方法,也可以有具体的实现方法,也就是说继承了接口后也是可以实现接口里定义的方法
参考文章:
- C#之接口
12.private、protected、public、internal
修饰访问符这个算是挺基础的了,不过也不能忘记哦
- public:同一程序集中的任何其他代码或引用该程序集的其他程序集都可以访问该类型或成员。
- private:只有同一类或结构中的代码可以访问该类型或成员。
- protected:只有同一类或结构或者此类的派生类中的代码才可以访问的类型或成员。
- internal:同一程序集中的任何代码都可以访问该类型或成员,但其他程序集中的代码不可以。
- protected internal:由其声明的程序集或另一个程序集派生的类中任何代码都可访问的类型或成员。 从另一个程序集进行访问必须在类声明中发生,该类声明派生自其中声明受保护的内部元素的类,并且必须通过派生的类类型的实例发生。
参考文章:
1.访问修饰符(C# 编程指南)
13.asp.net中 static的存活周期
全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 当类首次被加载时static定义的变量被分配空间,程序结束后由系统释放.
如果在一个程序里过多的使用static定义的成员,确实很占内存,因为他的生命周期是整个程序,程序运行时无法被gc所回收,直到程序结束,释放内存.
参考文章:
14.try{}里有一个return语句,那么紧跟 在这个try后的finally{}里的代码会不会被执行,是在return前还是后
这题我tm面试的几间都有啊,公司得有多懒
答案:会执行,在return后执行
15.new的作用,where的作用
- new 运算符:用于创建对象和调用构造函数。
- new 修饰符:用于向基类成员隐藏继承成员。
- new 约束:用于在泛型声明中约束可能用作类型参数的参数的类型。
参考文章:
16.this的作用
this 关键字引用类的当前实例,还可用作扩展方法的第一个参数的修饰符。
用途:
- 限定被相似的名称隐藏的成员,例如
public Employee(string name, string alias)
{
// Use this to qualify the fields, name and alias:
this.name = name;
this.alias = alias;
}
- 将对象作为参数传递到其他方法,例如
CalcTax(this);
- 声明索引器,例如:
public int this[int param]
{
get { return array[param]; }
set { array[param] = value; }
}
参考文章:
this(C# 参考)
17.MVC的各个部分用什么技术实现,和三层架构的关系
这个要详细讲的话得要一本书吧,我就说大概。ASP.NET MVC包含了三部分,Model,View和Controller。Controller负责后台逻辑代码,View是纯净的HTML页面,Model是中间数据层。
1.概述
- 当我们讨论系统时,它一般包含用户输入逻辑、业务处理逻辑以及UI显示逻辑等,MVC是一种架构模式,它能够让我们开发出各个模块之间松耦合的应用程序。MVC最主要的目的是“关注点分离”,它能够分离开UI显示、业务逻辑以及用户输入等。根据MVC的规定,一个系统应该被划分为Model、View以及Controller三个部分
- Model:它被当做一个可以处理业务规则、逻辑以及数据的智能体,同时它独立于MVC中其它两个部分(C和V)(不访问Controller和View,译者注)
- Controller:它负责接收用户请求、分配请求给处理者,它可以访问Model和View。
- View:它被当做一个哑巴,专门呈现最终的数据给用户。它可以是一个excel表单,也可以是一个包含许多记录的web页面甚至是一个纯文本。它可以访问Model。
2.MVC与三层架构的区别
①.各自原理
前提当然是要搞懂这两者的联系了
三层架构是最基本的项目分层结果,而MVC则是三层架构的一个变体,MVC是一种好的开发模式。
首先你要明白MVC分别代表的是什么意思.
- M 即Model(模型层),主要负责出来业务逻辑以及数据库的交互
- V 即View(视图层),主要用于显示数据和提交数据
- C 即Controller(控制器),主要是用作捕获请求并控制请求转发
三层:UI 界面层 BLL 业务逻辑层,DAL数据访问层,Model 实体层
MVC中的的M 不是三层中的Model(实体层),他其实包括三层中的 BLL,DAL,Model,这是非常要注意的,这也是他们之间的区别的关键所在
三层是基于业务逻辑来分的,而mvc是基于页面来分的
MVC是 Model-View-Controller,严格说这三个加起来以后才是三层架构中的WEB层,也就是说,MVC把三层架构中的WEB层再度进行了分化,分成了控制器、视图、实体三个部分,控制器完成页面逻辑,通过实体来与界面层完成通话;而C层直接与三层中的BLL进行对话
②.区别之处
- 在三层中也提到了Model,但是三层架构中Model的概念与MVC中Model的概念是不一样的,“三层”中典型的Model层是已实体类构成的,而MVC里,则是由业务逻辑与访问数据组成的。
- 首先,MVC和三层架构,是不一样的。
三层架构中,DAL(数据访问层)、BLL(业务逻辑层)、WEB层各司其职,意在职责分离。
MVC是 Model-View-Controller,严格说这三个加起来以后才是三层架构中的WEB层,也就是说,MVC把三层架构中的WEB层再度进行了分化,分成了控制器、视图、实体三个部分,控制器完成页面逻辑,通过实体来与界面层完成通话;而C层直接与三层中的BLL进行对话。所以, .net的三层结构中,并没有action这个概念。 - MVC模式是一种复合设计模式,一种解决方案;三层是种软件架构,通过接口实现编程
- 三层模式是体系结构模式,MVC是设计模式
- 三层模式又可归于部署模式,MVC可归于表示模式
参考文章:
18.MVC框架中可以实现AOP效果的接口是?
关于AOP,它面向的是一个切面,能够把公共的功能抽出来,独立开发,然后将公共部分实现,在开发人员不知情的情况下,添加进去。而在MVC前台框架中,MVC中Controller中的Filter可以将公共的代码抽离出来。
实现AOP效果的接口(只列举常用)
Asp.Net MVC提供了以下几种默认的Filter:
Filter Type | 实现接口 | 执行时间 | Default Implementation |
Authorization filter | IAuthorizationFilter | 在所有Filter和Action执行之前执行 | AuthorizeAttribute |
Action filter | IActionFilter | 分别在Action执行之前和之后执行。 | ActionFilterAttribute |
Result filter | IResultFilter | 分别在Action Result执行之后和之前 | ResultFilterAttribute |
Exception filter | IExceptionFilter | 只有在filter,或者 action method, 或者 action result 抛出一个异常时候执行 | HandleErrorAttribute |
参考文章:
19.Entity Framework是什么
1.Entity Framework简述
微软官方提供的ORM工具,ORM让开发人员节省数据库访问的代码时间,将更多的时间放到业务逻辑层代码上。EF提供变更跟踪、唯一性约束、惰性加载、查询事物等。开发人员使用Linq语言,对数据库操作如同操作Object对象一样省事。
EF有三种使用场景,
- 从数据库生成Class
- 由实体类生成数据库表结构,
- 通过数据库可视化设计器设计数据库,同时生成实体类。
ORM 是什么?
ORM 是将数据存储从域对象自动映射到关系型数据库的工具。ORM主要包括3个部分:域对象、关系数据库对象、映射关系。ORM使类提供自动化CRUD,使开发人员从数据库API和SQL中解放出来。
EntityFramework 架构
- EDM (实体数据模型):EDM包括三个模型,概念模型、 映射和存储模型。
- 概念模型 ︰ 概念模型包含模型类和它们之间的关系。独立于数据库表的设计。
- 存储模型 ︰ 存储模型是数据库设计模型,包括表、 视图、 存储的过程和他们的关系和键。
- 映射 ︰ 映射包含有关如何将概念模型映射到存储模型的信息。
- LINQ to Entities ︰ LINQ to Entities 是一种用于编写针对对象模型的查询的查询语言。它返回在概念模型中定义的实体。
- Entity SQL: Entity SQL 是另一种炉类似于L2E的言语,但相给L2E要复杂的多,所以开发人员不得不单独学习它。
- Object Services(对象服务):是数据库的访问入口,负责数据具体化,从客户端实体数据到数据库记录以及从数据库记录和实体数据的转换。
- Entity Client Data Provider:主要职责是将L2E或Entity Sql转换成数据库可以识别的Sql查询语句,它使用Ado.net通信向数据库发送数据可获取数据。
- ADO.Net Data Provider:使用标准的Ado.net与数据库通信
DBContext
DbContext是EntityFramework很重要的部分,连接域模型与数据库的桥梁,是与数据库通信的主要类。
DbContext主要负责以下活动:
- EntitySet::DbContext包含了所有映射到表的entities
- Querying:将Linq-To-Entities转译为Sql并发送到数据库
- Change Tracking:从数据库获取entities后保留并跟踪实体数据变化
- Persisting Data:根据entity状态执行Insert、update、delete命令
- Caching:DbContext的默认第一级缓存,在上下文中的生命周期中存储entity
- Manage Relationship:DbContext在DbFirst模式中使用CSDL、MSL、SSDL管理对象关系,Code first中使用fluent api 管理关系
- Object Materialization:DbContext将物理表转成entity实例对象
参考文章:
20.entityframework的开发模式
简述
有三种方式:Code First、DBFirst、Model First
- CodeFirst 领域设计时先定义实体类,用实体类生成数据库
- DbFirst 从数据库生成实体类
- Model First 使用Visual Studio实体设计器,设计ER,同时生成Entity类和DB
查询方式
- LINQ to Entities:
//Querying with LINQ to Entities
using (var context = newSchoolDBEntities())
{
var L2EQuery = context.Students.where(s => s.StudentName == "Bill");
var student = L2EQuery.FirstOrDefault<Student>();
}
LINQ Query syntax:
using (var context = new SchoolDBEntities())
{
var L2EQuery = from st in context.Students
where st.StudentName == "Bill"select st;
var student = L2EQuery.FirstOrDefault<Student>();
}
- Entity SQL
//Querying with Object Services and Entity SQL
string sqlString = "SELECT VALUE st FROM SchoolDBEntities.Students " +
"AS st WHERE st.StudentName == 'Bill'";
var objctx = (ctx as IObjectContextAdapter).ObjectContext;
ObjectQuery<Student> student = objctx.CreateQuery<Student>(sqlString);
Student newStudent = student.First<Student>();
//使用EntityDataReader
using (var con = newEntityConnection("name=SchoolDBEntities"))
{
con.Open();
EntityCommand cmd = con.CreateCommand();
cmd.CommandText = "SELECT VALUE st FROM SchoolDBEntities.Students as st where st.StudentName='Bill'";
Dictionary<int, string> dict = newDictionary<int, string>();
using (EntityDataReader rdr = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.CloseConnection))
{
while (rdr.Read())
{
int a = rdr.GetInt32(0);
var b = rdr.GetString(1);
dict.Add(a, b);
}
}
}
- Native SQL
using (var ctx = newSchoolDBEntities())
{
var studentName = ctx.Students.SqlQuery("Select studentid, studentname, standardId from Student where studentname='Bill'").FirstOrDefault<Student>();
}
当你自认为做出了不错的功能但描述出来时又支支吾吾的时候,不要为自己说不出来而懊恼,因为不是你发挥有问题,更不要向别人解释用了啥高大上插件,别让自己成为接口程序员,请静下心回去补补基础。