引言
今天繼續的是去那幾家面試公司的一些面試題目,適合剛出來或者兩三年經驗的,大牛可以適量吐槽下,找工作的可以補補基礎。
這系列文章請查看這里:
11.interface是否可繼承interface?abstract class 是否可實現interface
回答1:接口可以繼承接口,而且可以繼承多個接口,用“,”進行分割,接口不允許直接或間接地從自身繼承。和類的繼承相似,接口的繼承也形成接口之間的層次結構
回答2:抽象類是可以實現接口的,抽象類里可以有抽象方法,也可以有具體的實現方法,也就是說繼承了接口后也是可以實現接口里定義的方法
參考文章:
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>();
}