.net 面试详解(应用篇)

本篇文章主要产考网上资料列举一些C#语法相关的面试题以及产考回答,希望能对学习C#、.Net的读者有所帮助。有不妥之处欢迎指正。

这里附加一个关于数据库面试题的连接:http://www.mianwww.com/html/2012/03/13652.html

基础篇

一名入门的asp.net程序员应该掌握的知识:
(1)熟练使用Sql Server中企业管理器、查询分析器和事件探查器,能熟练编写T-SQL、存储过程、用户自定义函数、视图、触发器;
(2)了解ASP.net服务器控件的生命周期;
(3)熟练掌握HTML,CSS,javascript,xml,Web Service,AJAX;
(4)掌握多层结构以及类的设计方法;
(5)了解网站安全漏洞相关方面以及优化技巧;
1、可以使用抽象函数重写基类中的虚函数吗?
答:可以,需使用new修饰符显式声明,表示隐藏了基类中该函数的实现。

复制代码 代码如下:
class BaseClass
{
public virtual void A()
{
HttpContext.Current.Response.Write(“阿会楠”);
}
}
abstract class dClass : BaseClass
{
public new abstract void A();
}
2、接口可以包含哪些成员?
答:接口可以包含属性、方法、索引指示器和事件,但不能包含常量、域、操作符、构造函数和析构函
数,而且也不能包含任何静态成员。
3、如何把一个array复制到arrayList里。
复制代码 代码如下:
string[] arrA = new string[]{“阿”,”会”,”楠”};
ArrayList arrB = new ArrayList();
foreach(string a in arrA)
{
arrB.Add(a);
}
foreach (string b in arrB)
{
Response.Write(b);
}
4、概述三层结构体系。
答:主要包括界面层,业务逻辑层,数据访问层。
5、StringBuilder和String的区别。
答:使用String类,在赋值时会产生一个新的对象,而StringBuilder不会,所以在大量字符串拼接或频
繁对某一字符串进行操作时最好使用StringBuilder。
6、什么是虚函数?什么是抽象函数?
答:
虚函数:没有实现的,可以由子类继承并重写的函数。
抽象函数:规定其非虚子类必须实现的函数,必须被重写。
7、什么是Web Service?
答:Web Service是基于网络的、分布式的模块化组件,它执行特定的任务,遵守具体的技术规范,这些
规范使得Web Service能与其他兼容的组件进行互操作。
8、ADO.net常用对象有哪些?
答:
Connection:数据库连接对象
Command:数据库命令
DataReader:数据阅读器
DataSet:数据集
9、委托声明的关键字是?
答:delegate
10、在ASP.net中所有的自定义用户控件都必须继承自?
答:Control类

11、asp.net 页面传值的方式有哪些?

页面传值是学习asp.net初期都会面临的一个问题,总的来说有页面传值、存储对象传值、ajax、类、model、表单等。但是一般来说,常用的较简单有QueryString,Session,Cookies,Application,Server.Transfer。

用法:http://www.cnblogs.com/zhangkai2237/archive/2012/05/06/2486462.html

 

应用篇

1.使用ViewState的有点和缺点分别是什么?

好处:

一、耗费的服务器资源较少(和Application、Session相比)。因为,视图状态数据都写入了客户端计算机中。

二、易于维护。默认情况下,.NET系统自动启用对控件状态数据的维护。

三、增强的安全功能。视图状态中的值经过哈希计算和压缩,并且针对Unicode实现进行编码,其安全性要高于使用隐藏域。

缺点:

一、性能注意事项。由于视图状态存储在页本身,因此如果存储较大的值,即使在视图状态分块的情况下,用户显示页和发送页时的速度仍然可能减慢。

二、设备限制。移动设备可能没有足够的内存容量来存储大量的视图状态数据。因此,移动设备上的服务器控件时,将使用其他的实现方法。

三、潜在的安全风险。视图状态存储在页上的一个或多个隐藏域中。虽然视图状态以哈希格式存储数据,但他能被篡改。如果直接查看页输出源,能看到隐藏域中的信息,这导致潜在的安全性问题。

2. 视图状态ViewState的具体运行过程是什么?

每当用户请求某个.aspx页面时,.NET框架首先把相关控件的状态数据序列化成一个字符串,然后,将其做为名为__VIEWSTATE的隐藏域的Value值发送到客户端。

如果页面是第一次被请求,那么服务器控件也将是被第一次执行时,名为__VIEWSTATE的隐藏域中只包含控件的默认信息,通常为空或null。

在随后的回送事件中,ViewState中就保存了服务器控件在前面回送中可用的属性状态。这样服务器控件就能监视在当前被处理的回送事件发生之前的状态了。这些过程是由.NET框架负责的,对用户来说是执行.aspx页面就有了持续执行的效果。

3.asp.net中分页的几种方法

ASP.NET分页的常用方法有以下几种。
启用部分数据控件的内置分页功能,如设置GridView控件的“AllowPaging”属性为“true”,类似的数据控件还有DetailsView等。
通过SQL查询语句,以提取指定部分的数据的方式完成分页的功能。也包括调用数据库中内置的存储过程完成分页数据的提取。
调用所对应数据适配器对象(DataAdapter对象)的Fill方法时,传递分页参数以完成数据集的分页功能。
通过访问DataTable对象的“Rows”属性,以循环输出的方式访问结果集中指定区段的数据行,以达到分页的效果。
【分析】
分页功能在大部分WEB项目中使用比较广泛,本题考查面试者对ASP.NET中可用分页方法的了解程度。在页面布局等方面要求不高的情况下,例如WEB后台管理系统,使用数据控件内置的分页功能通常是编程者的首选。为了展示常用的这四种分页方法,笔者制作一个实例,在同一个页面中分别用这四种方法对相同的结果集分页显示。在VS 2008中添加新的WEB窗体到NetWeb3项目,并命名为Pager.aspx。在页面中添加1个GridView控件,用于展示内置分页功能,添加2个Repeater控件,用于展示SQL语句分页和数据适配器对象分页。最后通过在Pager.aspx页面导入System.Data命名空间,在页面中直接用for循环输出dt数据表的指定数量记录,以完成分页显示的效果。编写Pager.aspx如代码12.12所示。代码12.12 多种方法分页显示页面:Pager.aspx

< html xmlns=”http://www.w3.org/1999/xhtml” >
<head runat=”server”>
<title>四种分页方法实例</title>
< /head>
< body>
< form id=”form1″ runat=”server”>
<div>
< h3>控件内置分页【每页3条记录】</h3>
< asp:GridView runat=”server” ID=”GView” AllowPaging=”true” PageSize=”3″></asp:GridView>
< h3>数据适配器分页【当前显示第1页,每页2条记录】</h3>
< asp:Repeater runat=”server” ID=”Rp1″ >
< HeaderTemplate><ul></HeaderTemplate>
< ItemTemplate>
< li><asp:Label runat=”server” ID=”UName” Text=’<%# Eval(“UserName”) %>’></asp:Label><asp:Label runat=”server” ID=”Msg” Text=’<%# Eval(“Message”) %>’></asp:Label></li>
< /ItemTemplate>
< FooterTemplate></ul></FooterTemplate>
< /asp:Repeater>
< h3>SQL分页【当前显示第2页,每页3条记录】</h3>

< asp:Repeater runat=”server” ID=”Rp2″ >
< HeaderTemplate><ul></HeaderTemplate>
< ItemTemplate>
< li><asp:Label runat=”server” ID=”UName” Text=’<%# Eval(“UserName”) %>’></asp:Label><asp:Label runat=”server” ID=”Msg” Text=’<%# Eval(“Message”) %>’></asp:Label></li>
< /ItemTemplate>
< FooterTemplate></ul></FooterTemplate>
< /asp:Repeater>
< h3>数据表分页【当前显示第1页,每页3条记录】</h3>
< %
Response.Write(“<ul>”);
int i;
string UName;
string Msg;
for(i=0;i<3;i++)
{
UName = dt.Rows[0].ToString();
Msg = dt.Rows[1].ToString();
Response.Write(String.Format(“<li>{0}:{1}</li>”,UName,Msg));
}
Response.Write(“</ul>”);
%>
< /div>
< /form>
< /body>
< /html>


编写Pager.aspx.cs如代码12.13所示。代码12.13 多种方法分页逻辑代码:Pager.aspx.cs

using System;
………………………………
//导入必要的命名空间,使用SQL SERVER数据提供者
using System.Data.SqlClient;

namespace NetWeb3
{
public partial class Pager : System.Web.UI.Page
{
//从Web.config的AppSettings节点的第1个子节点中获取数据库连接字符串
//将连接字符串对象引用赋值给静态字符串变量CnStr
static string CnStr = ConfigurationManager.AppSettings[0];
//根据CnStr变量创建SqlConnection对象,引用为cn
SqlConnection cn = new SqlConnection(CnStr);
//声明SqlDataAdapter类型变量da
SqlDataAdapter da;
//创建DataSet对象,引用为ds
DataSet ds = new DataSet();
//声明DataTable类型的变量dt
//protected修饰符可以保证在*.aspx中可以访问dt
protected DataTable dt;

protected void Page_Load(object sender, EventArgs e)
{
this.GView.PageIndexChanging += new GridViewPageEventHandler(GView_PageIndexChanging);
//判断页面是否为首次加载
if (!IsPostBack)
{
//调用自定义的MyBind方法
MyBind();
}
}

protected void MyBind()
{
string SqlStr = “SELECT [UserName],[Message] FROM [LeaveMsg]“;
//根据SqlStr和cn创建新的SqlDataAdapter对象,引用为da变量
da = new SqlDataAdapter(SqlStr, cn);
//调用da的Fill方法,将记录填充到ds,其DataTable名称为LeaveMsg1
da.Fill(ds, “LeaveMsg1″);
//将LeaveMsg1数据表设置为GView控件的数据源
this.GView.DataSource = ds.Tables["LeaveMsg1"];

//调用da的Fill方法,将记录填充到ds,其DataTable名称为LeaveMsg2
//Fill方法接收的第2个参数代表从第几条记录开始填充,第3个参数代表填充多少条记录
da.Fill(ds,0,2, “LeaveMsg2″);
//将LeaveMsg1数据表设置为Rp1控件的数据源
this.Rp1.DataSource = ds.Tables["LeaveMsg2"].DefaultView;

cn.Open();
//编写SQL语句,直接在数据库查询时分页获取数据
SqlStr = “Select Top 3 [UserName],[Message] from [LeaveMsg] where [id] Not IN (Select Top (3*1) [id] from [LeaveMsg])”;
//根据SqlStr和cn创建新的SqlCommand对象,引用为cmd变量
SqlCommand cmd = new SqlCommand(SqlStr, cn);
//调用cmd的ExecuteReader方法,返回数据读取器,引用为dr
SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
//将dr设置为Rp2控件的数据源
this.Rp2.DataSource = dr;
//将LeaveMsg1数据表对象引用赋值给dt,供*.aspx中访问
dt = ds.Tables["LeaveMsg1"];
//绑定页面所有控件的数据
this.DataBind();
//关闭数据读取器,同时关闭数据库连接
dr.Close();
}

//该方法为GView控件的数据页索引变化事件的处理方法
protected void GView_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
//设置新的页索引
GView.PageIndex = e.NewPageIndex;
//再次调用MyBind方法,绑定页面数据
MyBind();
}
}
}


打开IE浏览器,在浏览器地址栏输入“http://localhost/Pager.aspx”

在另一篇详细讲解自定义分页的博文:http://www.cnblogs.com/robin-zgp/articles/3116915.html

4.知道asp.net MVC 模式吗?请讲下?

ASP.NET MVC Framework是微软官方提供的MVC模式编写ASP.NET Web应用程序的一个框架.
已于2009年3月19日正式发布.
MVC(Model-View-Controller)用于表示一种软件架构模式.
它把软件系统分为三个基本部分:模型(Model),视图(View)和控制器(Controller)

当然这个题目要想真正回答好,还是需要好好喝一壶的,怎么也得真正用过一些吧,比如它的Routing机制,这个讲出来了,面试官估计会认为你做过而不是停留在表面。

5. 请简单介绍依赖注入在asp.net中的基本体现

所谓“依赖注入”,就是将应用程序所依赖的组件在运行的时候动态的加载到应用程序中间。依赖注入的目标并非为、应用程序添加更多的功能,而是提升了组件的重用性,并为应用程序搭建一个具有较强灵活性和扩展性的平台。在Asp.net中,程序的实现是如此实现的:Assembly.Load(AssemblyName).CreateInstance(TypeName(类名等)),如此可以在程序中得到一个要求的对象实例。在程序的实现过程中间,可以配合反射技术,达到更加灵活的变化。

 

6.ADO.NET中的五个主要对象

1、Connection :主要是开启程序和数据库之间的连接。没有利用连接对象将数据库打开,是无法从数据库中取得数据的。 Close 和 Dispose 的区别, Close 以后还可以 Open , Dispose 以后则不能再用。
2、Command :主要可以用来对数据库发出一些指令,例如可以对数据库下达查询、新增、修改、删除数据等指令,以及调用存在数据库中的存储过程等。这个对象是架构在 Connection 对象上,也就是 Command 对象是透过连接到数据源。
3、DataAdapter :主要是在数据源以及 DataSet 之间执行数据传输的工作,它可以透过 Command 对象下达命令后,并将取得的数据放入 DataSet 对象中。这个对象是架构在 Command 对象上,并提供了许多配合 DataSet 使用的功能。
4、DataSet :这个对象可以视为一个暂存区( Cache ),可以把从数据库中所查询到的数据保留起来,甚至可以将整个数据库显示出来, DataSet 是放在内存中的 。 DataSet 的能力不只是可以储存多个 Table 而已,还可以透过 DataAdapter 对象取得一些例如主键等的数据表结构,并可以记录数据表间的关联。 DataSet 对象可以说是 ADO.NET 中重量级的对象,这个对象架构在 DataAdapter 对象上,本身不具备和数据源沟通的能力;也就是说我们是将 DataAdapter 对象当做 DataSet 对象以及数据源间传输数据的桥梁。 DataSet 包含若干 DataTable 、 DataTableTable 包含若干 DataRow 。
5、DataReader :当我们只需要循序的读取数据而不需要其它操作时,可以使用 DataReader 对象。 DataReader 对象只是一次一笔向下循序的读取数据源中的数据,这些数据是存在数据库服务器中的,而不是一次性加载到程序的内存中的,只能(通过游标)读取当前行的数据,而且这些数据是只读的,并不允许作其它的操作。因为 DataReader 在读取数据的时候限制了每次只读取一笔,而且只能只读,所以使用起来不但节省资源而且效率很好。使用 DataReader 对象除了效率较好之外,因为不用把数据全部传回,故可以降低网络的负载。
ADO.NET 使用 Connection 对象来连接数据库,使用 Command 或 DataAdapter 对象来执行 SQL 语句,并将执行的结果返回给 DataReader 或 DataAdapter , 然后再使用取得的 DataReader 或 DataAdapter 对象操作数据结果。

 

7.Asp.net的身份验证方式有哪些,原理是什么?

1、    Windows 身份验证提供程序
提供有关如何将 Windows 身份验证与 Microsoft Internet 信息服务 (IIS) 身份验证结合使用来确保 ASP.NET 应用程序安全的信息。
2、 Forms 身份验证提供程序
提供有关如何使用您自己的代码创建应用程序特定的登录窗体并执行身份验证的信息。使用 Forms 身份验证的一种简便方法是使用 ASP.NET 成员资格和 ASP.NET 登录控件,它们一起提供了一种只需少量或无需代码就可以收集、验证和管理用户凭据的方法。有关更多信息,请参见使用成员资格管理用户和 ASP.NET 登录控件概述。
3、 Passport 身份验证提供程序

 提供有关由 Microsoft 提供的集中身份验证服务的信息,该服务为成员站点提供单一登录和核心配置文件服务。

 

8.ASP.NET Webform和ASP.NET MVC的区别

ASP.NET WebForm

ASP.NET Webform提供了一个类似于winform的事件响应GUI模型(event-driven GUI),隐藏了HTTP、HTML、JavaScript等细节,将用户界面构建成一个服务器端的树结构控件(Control),每个控件通过ViewState保持自己的状态,并自动把客户端的js事件和服务器端的事件联系起来。这种做法使得开发WinForm和WebForm程序具有相近的开发体验,填平WinForm开发(有状态、面向对象的)和WebForm开发(无状态、面向HTML的)之间的鸿沟。

这种设计在大型网站开发的时候,暴露出一系列弱点:

  1. ViewState可能过大。访问量非常大的情况下,viewstate占用的流量相当可观,这样直接影响页面传输速度。
  2. Page Life Cycle:过于复杂。比如控件的Init事件在Page的Init事件之前执行,而Load事件是控件后执行。事件处理的事件
  3. 缺乏对HTML的控制:一般每个控件负责自己的HTML输出,开发人员无法修改输出的HTML结构,除非自己写控件。而且HTML元素的ID比较复杂,也不便于js访问。
  4. 界面设计和逻辑开发的关注分离做的不好:Webform开发是一个页面对应一个code-behind class,原本的目的是将展示和逻辑分离。但是在实际开发的时候,面对某些需求,还是经常会在class中写一些控制界面展示的代码。
  5. 对测试的支持不好:页面和code-behind class绑定在一起,无法单独对逻辑进行测试;不支持单元测试。

ASP.NET MVC

ASP.NET MVC的优点如下:

  1. 采用MVC架构:分离了关注点,比如开发Controller的时候,只需关注如何处理交互,从request中获得什么数据,业务逻辑交给Model处理,还需要把哪些数据传给页面用于展示,如何展示交给View处理。
  2. 更好的扩展性:ASP.NET MVC框架由一些列独立的组件构成,你可以轻松替换,如路由系统、the View Engine、the controller factory或者其它框架的组件。
  3. 更好的可测性:关注点的分离另外一个好处就是更好的可测性。
  4. 能够完全控制输出的HTML。
  5. 强大的路由功能。

更多面试题目及技巧请进:http://www.mianwww.com/html/category/it-interview/aspnet

 

注:本文章属个人学习总结,部分内容参考互联网上的相关文章。 其中如果发现个人总结有不正确的认知或遗漏的地方请评论告知,欢迎交流。

 

posted @ 2013-06-10 14:42  张国朋  阅读(349)  评论(0)    收藏  举报