.NET开发工程师的常见面试题

2021-12-03 08:11:16 浏览数 (1)

{tabs-pane label="ASP.NET"}

ASP.NET 中页面之间传递值的几种方式?

QueryString(查询字符串):通过URL中的查询字符串(Default.aspx?id=5&name=abc)传值。

优点:简单便捷。 缺点:安全性差,且长度大小有限制。

Session:通过会话状态传值。

优点:当前会话中的所有页面均可使用,且能够传递任何对象。 缺点:可能会丢失(Session过期或失效等情况)。

Cookie:通过客户端Cookie传值。

优点:读取该Cookie的所有页面都可以使用。 缺点:只能够存储文本信息(字符串),且大小不能超过4KB。

Application:通过全局应用程序对象传值。

优点:整个应用程序都可以使用,且能够传递任何对象。 缺点:可能会产生并发问题。

Server.Transfer:通过服务器端重定向传值。

优点:可以将与最初请求相关的所有数据传递给重定向的页面。 缺点:资源消耗比较大。

Server.Transfer与Response.Redirect有什么区别?

Server.Transfer:服务器端重定向,在服务器内部将请求从A页面重定向到B页面。由于是在服务器内部进行重定向,浏览器端并不知道服务器内部发生了重定向,因此浏览器的地址栏显示的URL不变,仍是最初请求的A页面。服务器端重定向不能跨站点。 Response.Redirect:客户端重定向,服务器向客户端浏览器发送一个重定向信号和重定向的URL地址,浏览器收到该信号后,重新去请求要重定向的URL地址。由于重定向是发生在浏览器端,因此浏览器的地址栏会变成重定向后的URL。浏览器端重定向可以跨站点。

ASP.NET中的身份验证有那些?

Windows验证:ASP.NET会结合Internet信息服务(IIS),为每个用户开启Windows账户,通过Windows账户验证用户身份。 Forms验证:ASP.NET通过Web表单,为每个用户创建一个用cookie保存的身份验证票据,通过该票据验证用户身份。 Passport验证:由 Microsoft 提供的集中身份验证服务,通过将每个用户的信息提交给Passport 登录服务网站进行用户身份的验证。 None验证:自定义身份验证方式。

ASP.NET中调用Web Service的方法有哪些?

通过HTTP-GET请求调用。 通过HTTP-POST请求调用。 通过SOAP请求调用。

Session有什么缺点?可以使用什么方法加以解决?

Session缺点:默认情况下Session的存储采用的是“InProc”配置,即存储在IIS进程内存中,当IIS重启或发生进程回收时,Session则会丢失。 解决方法:可以将Session配置为“StateServer”或“SQLServer”——存储在状态服务进程或数据库中,可以避免丢失,但此时无法捕获Session_End事件

ASP.NET中所有自定义用户控件都必须继承自哪一个类?页面必须继承哪一个类?

用户控件基类:System.Web.UI.UserControl。 页面基类:System.Web.UI.Page。

Web Service有哪些优点?

Web Service是基于XML的,与具体的语言和平台无关,故可以实现跨平台、跨语言通信。 Web Service是采用SOAP协议(简单对象访问协议)进行通信的,该协议基于HTTP协议,故可以实现跨防火墙通信。 Web Service可以很容易的实现分布式的应用程序。

ASP.NET缓存有几种实现方式?

页面输出缓存:将页面全部进行缓存。 页面局部缓存:将页面中的一部分放在用户控件中,对该部分进行缓存。 数据缓存:使用Cache类进行数据缓存。 客户端缓存:使用HttpCachePolicy类进行客户端(浏览器)缓存。

什么是ViewState?有什么作用?

ViewState:视图状态。 Web 应用程序是无状态的。每次从服务器请求网页时,都会创建网页类的一个新实例。这通常意味着在每次往返过程中将会丢失所有与该页面及其控件关联的信息。为了克服 Web 编程的这一固有局限性,ASP.NET 页框架包含了状态管理功能,可以在往返过程之间保存页和控件的相关联的信息及其值。这便是视图状态。

ASP.NET中常见文件的后缀名有哪些?

aspx:页面 ascx:用户控件 asmx:Web Service ashx:一般处理程序 asax:Global.asax,全局应用程序配置

ASP.NET中的六大对象有哪些?

Request、(请求对象) Response、(响应对象) Server、(服务器对象) Session、(会话对象) Cookie、 Application(应用程序对象)

{/tabs-pane}

{tabs-pane label="C#"}

C#中的基本数据类型有哪些?

值类型:

代码语言:javascript复制
有符号整数(由小到大):sbyte、short、int、long
无符号整数(由小到大):byte、ushort、uint、ulong
浮点型:float、double、decimal
布尔型:bool
字符型:char

引用类型:

代码语言:javascript复制
string、object

重写和重载的区别?方法的override和overload有什么区别?

代码语言:javascript复制
重写(override):子类对基类中的虚成员(虚方法、虚属性等)或抽象成员(抽象方法、抽象属性等)进行覆盖,重新实现。
重载(overload):同一个类中,同名的方法具有不同的参数签名的实现。重载的必要条件是方法具有不同的参数签名。

方法的参数签名是指方法的参数个数、参数的数据类型、参数是否有ref、out、params修饰(方法的返回值类型不属于方法的参数签名)。

构造函数是否可以被继承?是否可以被重写?

代码语言:javascript复制
不能被继承,也不能被重写,但是在创建类的实例时会首先调用其基类的无参数构造函数。

C#中,运算符“?”和“??”的区别是什么?

?是和:结合在一起使用的,?:称为条件运算符(或三目运算符),该运算符根据布尔型表达式的值返回两个值之一。条件运算符的格式如下: condition ? first_expression : second_expression; 如果条件condition为 true,则计算第一表达式first_expression并以它的计算结果为准;如果为 false,则计算第二表达式second_expression并以它的计算结果为准。只会计算两个表达式其中的一个。 ?? 运算符称为 null 合并运算符,用于定义可以为 null 值的类型和引用类型的默认值。如果此运算符的左边不为 null,则此运算符将返回左边的值;如果此运算符的左边为null,则返回右边的值。

C#中,用const和readonly修饰的字段有什么区别?

代码语言:javascript复制
const:表示常量,其修饰的值是在编译期间确定的,因此在声明时只能通过常量表达式指定其值。
readonly:表示只读字段,其修饰的字段的值是在运行时计算的,在对象的实例构造函数或类的静态构造函数首次被调用时计算,之后字段的值便不能被更改。

C#中,new有几种用法?

1) 用于创建对象和调用构造函数。 2) 用于创建匿名类型的实例。 3) 在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员。

C#中,ref和out在修饰方法参数时有什么区别?

ref和out都可以实现将一个指定的参数按照引用进行传递: ref参数在传入方法之前必须进行初始化;而out参数在传入方法之前可以不用初始化。 ref参数在方法内部可以直接使用;而out参数在方法内部不能直接使用。 ref参数在方法内部可以使用也可以不使用;而out参数在方法返回之前必须对其赋值。

C#中,using有几种用法?

1) 导入和引用命名空间。 2) 给类型起别名。 3) 使用using声明的对象,可以确保在using代码块结束时,该对象所使用的资源被自动释放。

C#中,is和as有什么区别?

is:用于检查对象是否与给定的类型兼容。 as:用于对引用类型的变量进行类型转换。

什么是GC?为什么要用到GC?

GC:垃圾回收器(Garbage Collection) 计算机程序在运行过程中要使用内存,需要向操作系统申请内存空间。由于内存空间是有限的,所以程序在使用完内存之后要释放内存。垃圾收集器就是一种自动进行内存管理的机制,使得程序员不需要每次手动去分配和释放内存,由垃圾收集器全权负责内存的管理工作。这样可以使程序员的关注点转移到程序的功能和业务逻辑,提高了程序的安全性、稳定性、及开发效率。

什么是委托?事件跟委托是什么关系?

委托:表示具有一类相同签名的方法的封装类型。定义委托的关键字:delegate 事件也是一种委托。

ADO.NET中访问数据库的基本步骤是什么?

创建数据库连接对象。 打开连接。 创建命令对象,执行SQL语句。 关闭连接。

ADO.NET中常用对象有哪些?

SqlConnection:连接对象,用于执行与数据库的连接。 SqlCommand:命令对象,用于对数据库执行SQL语句。 SqlDataAdapter:适配器对象,用于填充数据集和更新数据库。 SqlParameter:参数对象,用于执行参数化SQL语句。 SqlDataReader:读取器对象,用于从数据库中快速逐行读取数据。 SqlTransaction:事务对象,用于执行数据库事务。

class和struct的区别?

1) 类是引用类型,结构是值类型。 2) 类可以继承,也可以实现接口;结构不能继承,但可以实现接口。 3) 类可以有显式声明的无参数构造函数;结构不能包含显式的无参数构造函数。 4) 结构中不能有实例字段初始值设定,但类没有任何限制。 5) 类的构造函数里面可以不用对所有字段进行初始化;结构的构造函数里面必须对所有字段进行初始化。 6) 类可以有析构函数,但结构不行。

C#中类成员的访问修饰符有哪些?

代码语言:javascript复制
public:公有的,任何位置都可以访问。
private:私有的,只有类的自身才能访问。
protected:受保护的,只有类的自身及其派生类才能访问。
internal:内部的,同一个程序集里面的任何位置都能访问。
protected internal :内部受保护的,同一个程序集里面的任何位置,或者不同程序集中的派生类可以访问。

面向对象的三大特征是什么?/面向过程和面向对象的区别

封装、继承、多态 ### 抽象类和接口的区别? 相同点:

代码语言:javascript复制
不能被直接实例化。
可以包含任意个抽象成员。

不同点:

代码语言:javascript复制
抽象类也是类,具有类的共同特点:单基类继承,多接口实现;接口不是类,只能继承多个接口。
抽象类中可以包含已经实现的非抽象成员;接口中所有的成员都是抽象的、没有实现的。

接口可以包含哪些成员?

方法、属性、事件、索引器

什么是装箱和拆箱?

装箱:将值类型转换为 object 类型或由此值类型实现的任何接口类型。 拆箱:将object类型或接口类型转换为实际的值类型。

C#中,哪些类型是值类型?哪些类型是引用类型?

值类型:结构、枚举。 引用类型:类、接口、委托、数组、字符串。

值类型和引用类型的区别?

代码语言:javascript复制
一般情况下,值类型的数据存储在栈上,引用类型的数据存储在堆上。
值类型的变量,变量本身存储的就是实际的数据;引用类型的变量,变量本身存储的仅仅是实际数据的引用地址,而实际的数据存储在托管堆上。
在作为方法的参数进行传递时,值类型参数传递的是值的副本,在方法中对该值进行修改不会影响原始值;引用类型参数传递的是参数的引用地址,在方法中对该参数进行修改会对托管堆上该地址的实际数据进行修改,从而会影响原始值。

{/tabs-pane} {tabs-pane label="SQL"}

sql查询第几到第几条的数据

方法一:

select top 10 * from A where id not in (select top 30 id from A order by id) order by id

方法二:

select top 10 * from A where id>(select max(id) from (

代码语言:javascript复制
select top 30 id from A order by id ) t)
方法三:

select * from ( select *,row_number() over (order by id) Row_No from A ) t where Row_No between 31 and 40

方法四:

select * from b1 where 1=1 order by d.DamageRecordlID asc offset 0 rows fetch next 5 rows only

sql存储过程的优化

CREATE PROC Proc_GetAllStuMark AS

代码语言:javascript复制
SELECT a.StuName, b.Subject, b.Score 
FROM StuInfo a, StuMark b
WHERE a.StuID=b.StuID

GO SET NOCOUNT ON -- 使返回的结果中不包含有关受 Transact-SQL 语句影响的行数的信息。以达到提高程序性能的目的。 EXEC Proc_GetAllStuMark sp_executesql Proc_GetAllStuMark --使用sp_executesql 执行存储过程

--创建带有参数的存储过程

--根据学生姓名,获得学生成绩 IF EXISTS (SELECT * FROM sysobjects WHERE NAME='Proc_GetStuMarkByStuName') DROP PROC Proc_GetStuMarkByStuName GO CREATE PROC Proc_GetStuMarkByStuName @stuname VARCHAR(20) AS

代码语言:javascript复制
SELECT a.StuName, b.Subject, b.Score 
FROM StuInfo a, StuMark b
WHERE a.StuID=b.StuID
AND a.StuName=@stuname

GO ? EXEC Proc_GetStuMarkByStuName '李四'

--创建带有输入输出参数的存储过程

if exists(select * from sysobjects where name='Proc_name2') drop proc Proc_name2 go create proc Proc_name2 @paper_id int, @paper_name varchar(200) output as select * from Paper where PaperId=@paper_id select @paper_name=[Name] from Paper where PaperId=@paper_id

declare @name varchar(200) set @name='' exec Proc_name2 800, @name output print @name

自定义函数的语法

--根据员工的id得到员工的信息 create function dbo.fun_GetPaperId(@uid int)

returns varchar(200) --返回的数据类型 begin

代码语言:javascript复制
declare @name varchar(200)
select @name=RealName from UserInfos where UserInfoId=@uid
return @name

end go select dbo.fun_GetPaperId(1401) --调用函数

SQL Server中,有一张学生成绩表,有三个字段:学生ID,学生姓名,考试成绩。如何查询出成绩排在前三名的学生?(注意:可能会有并列名次)

select * from ( select *,dense_rank() over (order by 学生成绩 desc) No from 学生成绩表 ) t where No<=3 SQL Server排名函数:row_number()、rank()、dense_rank() 区别:

使用exec和sp_executesql动态执行SQL语句

当需要根据外部输入的参数来决定要执行的SQL语句时,常常需要动态来构造SQL查询语句,个人觉得用得比较多的地方就是分页存储过程和执行搜索查询的SQL语句。一个比较通用的分页存储过程,可能需要传入表名,字段,过滤条件,排序等参数,而对于搜索的话,可能要根据搜索条件判断来动态执行SQL语句。

在SQL Server中有两种方式来执行动态SQL语句,分别是exec和sp_executesql。sp_executesql相对而言具有更多的优点,它提供了输入输出接口,可以将输入输出变量直接传递到SQL语句中,而exec只能通过拼接的方式来实现。还有一个优点就是sp_executesql,能够重用执行计划,这就大大提高了执行的性能。所以一般情况下建议选择sp_executesql来执行动态SQL语句。

使用sp_executesql需要注意的一点就是,它后面执行的SQL语句必须是Unicode编码的字符串,所以在声明存储动态SQL语句的变量时必须声明为nvarchar类型(如果不知道SQL语句有多长,可以直接用nvarchar(max)类型),否则在执行的时候会报“过程需要类型为 'ntext/nchar/nvarchar' 的参数 '@statement'”的错误,如果是使用sp_executesql直接执行SQL语句,则必须在前面加上大写字母N,以表明后面的字符串是使用Unicode类型编码的。

SQL中数据库事务的四大特性:

1.原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。 2.一致性(Consistency)

代码语言:javascript复制
一致性是指事务必须使用数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行后都必须处于一致性的状态。

3.隔离性(Isolation)

代码语言:javascript复制
隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启一个事务,不能被其他的操作所干扰,多个并发事务之间要相互隔离。

4.持久性(Durability)

代码语言:javascript复制
持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即使是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

使用事务最大的好处是什么?

事务最大的好处就是可以保证数据的完整性和一致性,因为事务要么全部执行成功,要么全部执行不成功。

存储过程和函数的区别?

函数是可以嵌入在sql语句中使用的,比如函数可以作为查询语句的一个部分来调用;存储过程大多是作为一个独立的部分来执行,存储过程需要通过exec调用。 函数限制比较多,比如不能用临时表,只能用表变量等;而存储过程的限制相对就比较少,几乎所有的Sql代码都可以使用。 一般来说,存储过程实现了业务逻辑的功能,比较复杂;而函数实现的功能针对性比较强,用于完成单一目的功能。 对于存储过程来说可以返回一个或多个输出参数,也可以返回多个结果集,而函数只能返回一个值或者表对象。

数据库索引是什么?有什么作用?

数据库索引:是数据库表中一列或多列的值进行排序的一种结构。 作用:索引类似于一本书的目录,主要用于加快从表中查询数据的速度。

数据库索引的分类及区别?

聚集索引:表示索引中的结构与表中相应行的数据在物理磁盘上存储的顺序相同的索引。

代码语言:javascript复制
非聚集索引:表示索引中的结构与表中相应行的数据在物理磁盘上存储的顺序不相同的索引。

SQL Server中,触发器分为哪几种?分别代表什么含义?

SQL Server中触发器主要分为两大类: DML触发器:当数据库中发生数据操作语言 (DML) 事件时将调用DML触发器。DML事件包括在指定表或视图中修改数据的 INSERT 语句、UPDATE 语句或 DELETE 语句。 DML触发器又分为: 1) after触发器(之后触发):在执行了 INSERT、UPDATE 或 DELETE 语句操作之后被触发。可以定义三种类型:INSERT触发器、UPDATE触发器、DELETE触发器。after触发器只能定义在表上。 2) instead of 触发器 (之前触发):instead of触发器也叫替代触发器,表示并不执行其定义的操作(INSERT、UPDATE、DELETE),而是仅执行触发器本身。既可以在表上定义instead of触发器,也可以在视图上定义。  DDL触发器:当数据库中发生数据定义语言 (DDL) 事件时将调用DDL触发器。DDL事件主要与以关键字 CREATE、ALTER 和 DROP 开头的SQL语句对应。

delete和truncate有什么区别?

delete可以带where条件,用于删除指定条件的数据;truncate和table组合在一起使用“truncate table 表名”,truncate不能带where条件。 不带where条件的delete和truncate都用于删除表中的所有数据,但如果表中有自增长列,delete在删除所有数据之后,下一次插入新的数据时自增长列依然紧接着最后一次的数值的下一个;而truncate删除所有数据后,下一次插入新数据的自增长列的数值将被重置,重新开始。

union和union all的区别?

union 和 union all都可以用作两张表数据的合并: union:在合并时会去除掉重复的记录。 union all:直接合并,对重复的记录不作处理。

SQL Server中,向一个表中插入了新数据,如何得到自增长字段的当前值?

select @@identity

SQL Server中,游标有什么作用?如何知道游标已经到了最后?

作用:从包括多条数据记录的结果集中每次提取一条记录。游标类似于程序代码中对集合的遍历循环,能够遍历结果中的所有行,在遍历过程中,每次只读取一行的数据。 当全局变量@@fetch_status的值不等于0时,表示游标已经到了最后。

{/tabs-pane} {tabs-pane label="前端"}

jquery中实现Ajax请求的常用方法有哪些?有什么区别?

.get方法:通过get方式发送请求。.post:通过post方式发送请求。.ajax:可以使用指定的方式来发送请求。.ajax方法是jquery中发送Ajax请求的最底层方法,可以完全自定义发送请求时的相关参数。

手动实现Ajax请求的步骤是什么?

创建XMLHttpRequest对象 调用open方法初始化请求 设置回调函数 发送请求

GET 和 POST 请求的优缺点

(1)post更安全(不会作为url的一部分,不会被缓存、保存在服务器日志、以及浏览器浏览记录中) (2)post发送的数据更大(get有url长度限制) (3)post能发送更多的数据类型(get只能发送ASCII字符) (4)post比get慢 (5)post用于修改和写入数据,get一般用于搜索排序和筛选之类的操作(淘宝,支付宝的搜索查询都是get提交),目的是资源的获取,读取数据

为什么get比post更快

{callout color="#f0ad4e"} 1.post请求包含更多的请求头因为post需要在请求的body部分包含数据,所以会多了几个数据描述部分的首部字段(如:content-type),这其实是微乎其微的。 2.最重要的一条,post在真正接收数据之前会先将请求头发送给服务器进行确认,然后才真正发送数据post请求的过程: (1)浏览器请求tcp连接(第一次握手) (2)服务器答应进行tcp连接(第二次握手) (3)浏览器确认,并发送post请求头(第三次握手,这个报文比较小,所以http会在此时进行第一次数据发送) (4)服务器返回100 Continue响应 (5)浏览器发送数据 (6)服务器返回200 OK响应get请求的过程:

代码语言:javascript复制
(1)浏览器请求tcp连接(第一次握手)
(2)服务器答应进行tcp连接(第二次握手)
(3)浏览器确认,并发送get请求头和数据(第三次握手,这个报文比较小,所以http会在此时进行第一次数据发送)
(4)服务器返回200 OK响应也就是说,目测get的总耗是post的2/3左右,这个口说无凭,网上已经有网友进行过测试。

3.get会将数据缓存起来,而post不会可以做个简短的测试,使用ajax采用get方式请求静态数据(比如html页面,图片)的时候,如果两次传输的数据相同,第二次以后消耗的时间将会在10ms以内(chrome测试),而post每次消耗的时间都差不多。经测试,chrome和firefox下如果检测到get请求的是静态资源,则会缓存,如果是数据,则不会缓存,但是IE什么都会缓存起来,当然,应该没有人用post去获取静态数据吧,反正我是没见过。

{/callout}

{/tabs-pane}

0 人点赞