.net面试题
1、简述 private、 protected、 public、 internal 修饰符的访问权限。
访问修饰符 |
说明 |
public |
公有访问。不受任何限制。 |
private |
私有访问。只限于本类成员访问,子类,实例都不能访问。 |
protected |
保护访问。只限于本类和子类访问,实例不能访问。 |
internal |
内部访问。只限于本项目内访问,其他不能访问。 |
protected internal |
内部保护访问。只限于本项目或是子类访问,其他不能访问 |
2、ADO.NET中的五个主要对象
1、 Connection:与数据源建立连接。
2、 Command:对数据源执行SQL命令并返回结果。
3、 DataReader:读取数据源的数据,只允许对将数据源以只读、顺向的方式查看其中所存储的数据。其常用于检索大量数据,DataReader对象还是一种非常节省资源的数据对象。
4、 DataAdapter:对数据源执行操作并返回结果,在DataSet与数据源之间建立通信,将数据源中的数据写入DataSet中,或根据DataSet中的数据绑定数据源。
5、 DataSet:内存中的数据库,是数据表的集合,它可以包含任意多个数据表。
3、列举ASP.NET 页面之间传递值的几种方式。
1.querystring
2.cookies
3.Application
4.session
4、new有几种用法?
1)new 运算符:用于创建对象和调用构造函数。这种大家都比较熟悉,没什么好说的了。
2)new 修饰符:在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员。
3)new 约束:检查泛型实列是否具有默认构造函数,如没有则编译错误。
5、用sealed修饰的类有什么特点?
密封类,不能被其他类继承
6、请编程遍历页面上所有TextBox控件并给它赋值为string.Empty?
foreach (System.Windows.Forms.Control control in this.Controls) { if (control is System.Windows.Forms.TextBox) { System.Windows.Forms.TextBox tb = (System.Windows.Forms.TextBox)control ; tb.Text = String.Empty ; } }
后台(String.Empty是空字符串,是个特殊符号,在内存中有储存空间,null只是string类型的应用,没有在内存中储存,如果不实冽将报错。)
7、在.net中,配件的意思是?
程序集。(中间语言,源数据,资源,装配清单)
8、装箱和拆箱
装箱就是值类型转换为object类型,拆箱相反:object转化为值类型
装箱使任何事物看起来都像是一个对象,即装箱是一种让值类型看起来好像引用类型的处理过程。这样才符合面向对象把一切事物都看成对象的思想。当然有装箱就有拆箱。
9、如何理解三层架构
表现层----即页面呈现。
业务逻辑层----业务处理及数据传递。
数据访问层----即数据库交互等操作。
代码清晰、松散耦合、易管理、易维护、适合团队开发、
10. 能用foreach遍历访问的对象的要求
必须是集合或者数组。
实现了IEnumerator接口
11. GC是什么? 为什么要有GC?
GC(Garbage Collector,垃圾回收器)是一种自动回收内存的机制,释放已经不再使用的对象的内存空间。
1.创建新对象开辟内存空间,在使用完后需要释放内存,提高性能
2.避免开发人员直接操作内存,提高安全性
12. 介绍几个开源的项目
Json.NET
Log4net
Nuget
Linux
火狐等
- 说出五个集合类
Array
ArrayList
List<T>
Dictionary<TKey,TValue>
栈Stack 先进先出集合
- 什么是code-Behind技术。
Code Behind就是所谓的代码分离,一个前台aspx页,一个代码页ascx
- using关键字有什么用?什么是IDisposable?
1.引用命名空间
2.起别名 using sd=system.data
3.using语句,定义一个范围,在范围结束时处理对象。
IDisposable接口定义:定义一种释放分配的资源的方法。
.NET 平台在内存管理方面提供了GC(Garbage Collection),负责自动释放托管资源和内存回收的工作,但它无法对非托管资源进行释放,这时我们必须自己提供方法来释放对象内分配的非托管资源
16、不是说字符串是不可变的吗?string s="abc";s="123"不就是变了吗?
这个不是改变是在内存中重新开辟空间放了个123进去之前的abc还在内存中只不过s没有指向它了。
17、是否可以从一个static方法内部发出对非static方法的调用?
不可以,静态方法可以直接调用,非静态要实例化 New 对象调用,
在静态方法中调用非静态如果静态方法没实例就会出现空指针异常
18、说出一些常用的类、接口,请各举5个
常用类 :String System Responese Random Request
常用接口: Remote List Map Document NodeList
19、传入某个属性的set方法的隐含参数的名称是什么?
value,它的类型和属性所声名的类型相同。
20、C#支持多重继承么?
不支持。可以用接口来实现
21、C#中所有对象共同的基类是什么?
System.Object.
22、通过超链接怎样传递中文参数?
QueryString可以传递,涉及编码解码
23、AJAX解决什么问题?如何使用AJAX?AJAX有什么问题需要注意?项目中哪里用到了AJAX?
1.不提交页面就能实现局部数据刷新
2.在Javascript中使用XMLHttpRequest进行Http的请求
3.无法在页面中向和当前域名不同的页面发送请求
4.留言回复、注册信息验证、局部数据刷新等。
24、开放式问题:你经常访问的技术类的网站是什么?
博客园
51CTO
CSDN
25、你对.net的GC的理解
一种自动回收非托管资源的方法
26、请你简单的说明数据库建立索引的优缺点
使用索引可以加快数据的查询速度,不过由于数据插入过程中会建索引,所以会降低数据的插入、更新速度,索引还会占磁盘空间。
27、Session有什么重大BUG,微软提出了什么方法加以解决?(常考)
iis中由于有进程回收机制,系统繁忙的话Session会丢失,可以用Sate server或SQL Server数据库的方式存储Session不过这种方式比较慢,而且无法捕获Session的END事件。
28、说说在软件设计中你遇到的以空间换时间的例子?
用耗费掉的应用时间,所达到的结果
29、asp.net中的错误机制。(常考)
错误处理方法:
一是将错误信息记录日志,发邮件通知网站维护人员,方便技术人员对错误进行跟踪处理;二是以友好的方式提示最终用户页面发生了错误,而不能将未处理的错误信息显示给用户
Page_Error事件 > ErrorPage属性 > Application_Error事件 > <customErrors>配置项
30、有一个10个数的数组,计算其中不重复数字的个数。{3,5,9,8,10,5,3}
while (true)
{
Console.WriteLine("请输入一个数字");
int cr = Convert.ToInt32(Console.ReadLine());
if (cr == 0)
{
break;
}
if (!(cr > 2 && cr < 22))
{
Console.WriteLine("非法行数!");
continue;
}
for (int i = 0; i < cr; i++)
{
int k =0;
for (; k < i; k++)
{
Console.Write(" ");
}
for (int j = k; j < cr; j++)
{
Console.Write("* ");
}
Console.WriteLine();
}
}
}
}
31、下面是一个由*号组成的4行倒三角形图案。要求:1、输入倒三角形的行数,行数的取值3-21之间,对于非法的行数,要求抛出提示“非法行数!”;2、在屏幕上打印这个指定了行数的倒三角形。
*******
*****
***
*
while (true)
{
Console.Write("请输入行数:范围3-21,输入0退出程序。");
int line = 0;
if (!Int32.TryParse(Console.ReadLine(), out line))
{
Console.WriteLine("请输入正确的行数!");
continue;
}
if (line == 0)
{
Console.WriteLine("退出!");
break;
}
else if (!(line > 2 && line < 22))
{
Console.WriteLine("非法行数!请输入正确的行数!");
continue;
}
for (int i = 0; i < line; i++)
{
int j = 0;
for (; j < i; j++)
{
Console.Write(" ");
}
for (int k = j; k < line; k++)
{
Console.Write("* ");
}
Console.WriteLine();
}
}
32、下面的程序执行结果是什么?
class Person
{
public int Age { get; set; }
}
int i1 = 20;
int i2 = i1;
i1++;
Console.WriteLine(i2);//i2=20;
Person p1 = new Person();
p1.Age = 20;
Person p2 = p1;
p1.Age++;
Console.WriteLine(p2.Age); p2.age=21;
33、下面程序的执行结果是什么?
public struct Point
{
public int x;
public int y;
public Point(int x, int y)
{
this.x = x;
this.y = y;
}
}
Point p1 = new Point(100, 100);
Point p2 = p1;
p1.x = 200;
Console.WriteLine("{0},{1}", p1.x, p2.x);
200,100
34、不用JQuery等框架实现AJAX无刷新登录。(常考)
用纯XMLHttpRequest实现。
<body> <form id="form1" runat="server"> <div style="width: 100%; float: left; text-indent: 24px; font-size:12px"> <div style="float:left"> 您的用户名:<asp:TextBox ID="txtUserName" runat="server" style="border:1px solid #D4D8D9" onblur="return ValidateUser();"></asp:TextBox> </div> <div id="default" ></div> </div> </form> </body>
.Error{ border:1px solid #A2553B;width:140px;float:left;height:18px;line-height:18px;margin-left:24px;color:#4F4F4F;text-indent:12px;} .Right{ border:1px solid #419041;background-color:#EDFCE7;width:140px;float:left;height:18px;line-height:18px;margin-left:24px;color:#4F4F4F;text-indent:12px;}
<script language="javascript" type="text/javascript"> function ValidateUser() { //获得用于显示验证是否通过的详细信息 var obj=document.getElementById("default"); //获取用户输入的用户名的值 var str=document.getElementById("txtUserName").value; //定义一个bool型变量 var chk=true; if (chk){ //因为输入的用户名可能含有中文,所以将其解码 var username=escape(str); //用于验证用户名的后台页面 var usrurl="/Validate.aspx?UserName="+username; //获取从验证页面中异步传输过来的值 var sta=GetResponseText(usrurl); //如果异步传输失败 if(sta==false){ chk=true; obj.className="d_ok"; obj.innerHTML='该会员未能检测,可以尝试注册。'; } //异步传输成功 else{ //假如传过来的值的开始位置是"regok",这个值是在验证页面Response.Write出来的值,如果是regok则表示验证通过,否则的话就是验证失败. if(sta.indexOf("regok")!=-1){ //验证通过 chk=true; //用于显示验证是否通过的详细信息加上刚刚所定义正确时的样式 obj.className="Right"; obj.innerHTML='该会员名可以注册。'; }else{ //验证未通过 chk=false; //用于显示验证是否通过的详细信息加上刚刚所定义错误时的样式 obj.className="Error"; obj.innerHTML='该会员名已经被注册。'; } } }else{ obj.className="Error"; } return chk; } function GetResponseText(url) { //定义一个http_request变量 var http_request; if (window.XMLHttpRequest) { //对于Mozilla、Netscape、Safari等浏览器,创建XMLHttpRequest对象 http_request = new XMLHttpRequest(); if (http_request.overrideMimeType) { //如果服务器响应的header不是text/xml,可以调用其它方法修改该header http_request.overrideMimeType('text/xml'); } } else if (window.ActiveXObject) { // 对于Internet Explorer浏览器,创建XMLHttpRequest try { http_request = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { http_request = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {} } } //打开验证页面的地址 http_request.open('GET', url, false); http_request.send(null); if (http_request.readyState == 4) { // 收到完整的服务器响应 if (http_request.status == 200) { //HTTP服务器响应的值OK var requestdoc = http_request.ResponseText; } else { requestdoc = "error"; } } return requestdoc; } </script>
public partial class Validate : System.Web.UI.Page 2 { 3 //获取url传过来的值 4 private string UserName 5 { 6 get { return Request.QueryString["UserName"].ToString(); } 7 } 8 protected void Page_Load(object sender, EventArgs e) 9 { 10 //这里你可以连至用户表检查是否存在这个用户名,当然如果你用membership中的验证方法会更简洁. 11 if (Server.HtmlEncode(UserName) =="123456") 12 //还记得脚本中的if(sta.indexOf("regok")!=-1)这句吗,regok就是这里的啦.. 13 Response.Write("regok"); 14 else 15 Response.Write("error"); 16 } 17 }
35、Http状态码各是什么意思。
成功2×× 成功处理了请求的状态码。
200 服务器已成功处理了请求并提供了请求的网页。
204 服务器成功处理了请求,但没有返回任何内容。
重定向3×× 每次请求中使用重定向不要超过 5 次。
301 请求的网页已永久移动到新位置。当URLs发生变化时,使用301代码。搜索引擎索引中保存新的URL。
302 请求的网页临时移动到新位置。搜索引擎索引中保存原来的URL。
304 如果网页自请求者上次请求后没有更新,则用304代码告诉搜索引擎机器人,可节省带宽和开销。
客户端错误4×× 表示请求可能出错,妨碍了服务器的处理。
400 服务器不理解请求的语法。
403 服务器拒绝请求。
404 服务器找不到请求的网页。服务器上不存在的网页经常会返回此代码。
410 请求的资源永久删除后,服务器返回此响应。该代码与 404(未找到)代码相似,但在资源以前存在而现在不存在的情况下,有时用来替代404 代码。如果资源已永久删除,应当使用 301 指定资源的新位置。
服务器错误5×× 表示服务器在处理请求时发生内部错误。这些错误可能是服务器本身的错误,而不是请求出错。
500 服务器遇到错误,无法完成请求。
503 服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态。
36、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的代码会不会被执行,什么时候被执行?
会,在执行完return语句后执行。
37、一个数组:1,1,2,3,5,8,13,21...+m,求第30位数是多少?用递归实现;(常考!!!,提示:搜索斐波那契数列)
int i = 0,a=0,b=1,c;
while (i<30)
{
c =a+b;
Response.Write(c+"-");
a = b;
b = c;
i++;
}
38、产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。(要求使用两种方法)
List<int> li = new List<int>(100);
Random rd=new Random();
while (li.Count<100)
{
int myran = rd.Next(1, 101);
if (!li.Contains(myran))
{
li.Add(myran);
}
}
int d;
List<int> li = new List<int>(100);
for (int i = 0; i < li.Count; i++)
{
for (int j = 0; j < li.Count; j++)
{
if (li[i]<li[j])
{
d = li[j];
li[j] = li[i];
li[i] = d;
}
}
}
foreach (var item in li)
{
Response.Write(item + "..");
}
39、冒泡排序数组(背也要背下来,50%必考!)
var arr = [1, 2, 1, 5, 3, 2, 6];
var d, i = 0, len = arr.length;
for (; i < len; i++) {
for (var j = 0; j < len; j++) {
if (arr[i]<arr[j]) {
d = arr[j];
arr[j] = arr[i];
arr[i] = d;
}
}
}
40、C#中的委托是什么?事件是不是一种委托?事件和委托的关系。
a) 委托可以把一个方法作为参数代入另一个方法
b) 是,事件就是个委托调用jnh
c) 委托是类型,事件是对象
41、override与重载(overload)的区别
a) 重写---方法名、参数、返回值相同
b) 重载---参数类型、个数、顺序至少有一个不相同
42、属性和public字段的区别是什么?
a) 属性可以设置、判断值,字段不行
43、CTS、CLS、CLR分别作何解释(重要)把英文全称背过来。
a) CTS(Common Type System):通用语言系统。
b) CLS(Common Language Specification):通用语言规范。
c) CLR(Common Language Runtime):公共语言运行库。
IL/MSIL (Microsoft Intermediate Language) 微软中间语言 (IL是MSIL的缩写,译为中间语言)
CTS (Common Type System) 通用类型系统
CLS (Common Language Specification) 公共语言规范
CLR (Common Language Runtime) 公共语言运行时(也有的叫公共语言运行库)
JIT (Just in time) 即时编译器
44、C#和.Net的关系
a) C#运行需要.net环境
45、在dotnet中类(class)与结构(struct)的异同?
a) Class可以被实例化,属于引用类型,是分配在内存的堆上的,
b) Struct属于值类型,是分配在内存的栈上的
46、堆和栈的区别?
a) 由编译器自动分配释放 ,存放函数的参数值,局部变量的值
b) 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收
47、值类型和引用类型的区别?
a) 引用类型--a=b=1表示在内存中有一个值 a是它,b也是它
b) 值类型--a=b=1 表示在内存中有两个值 a=1 b=1;
48、C#中的接口和类有什么异同。
a) 都是引用类型
b) 接口---写的是抽象方法功能、属性。
c) 类--实现功能
49、abstract class和interface有什么区别?
a) abstract class--抽象类,只声明方法不实现的类
b) interface--接口中的所有方法都是抽象的,没有一个有程序体
50、XML 与 HTML 的主要区别
a) XML-是可扩展标记语言,用于数据格式化
b) HTML--超文本标记语言,用于网页页面显示
51、string str = null 与 string str =””说明其中的区别。
a) Null在内存中是没有值的,而“”在内存有值
52、StringBuilder 和 String 的区别?
a) String 对象是不可改变的,
b) 如果要在类里面定义成员变量,并且这个类的实例对象会在多线程环境下使用或者变量的内容不断变化,那么最好用StringBuffer。StringBuilder是线程不安全的,运行效率高
53、请叙述属性与索引器的区别。 (重要)
a) 属性--通过名称标识,通过简单名称或成员访问来访问,可以为静态成员或实例成员,属性的 get 访问器没有参数,属性的 set 访问器包含隐式value 参数。
b) 索引器--通过签名标识,通过元素访问来访问,必须为实例成员,索引器的get 访问器具有与索引,除了value 参数外,索引器的 set 访问器还具有与索引器相同的形参表。
54、请解释ASP。NET中的web页面与其隐藏类之间的关系?
a) Web页面会继承隐藏类
55、DataReader和DataSet的异同?
a) DataReader使用时始终占用SqlConnection
b) DataSet则是将数据一次性加载在内存中
56、string、String;int、Int32;Boolean、bool的区别?
a) String、Int32、Boolean是。Net定义的类
b) string、int、bool是在C#中定义的别名
57、Server.Transfer和Response.Redirect的区别是什么?(常考)
a) Server.Transfer只能够转跳到本地虚拟目录指定的页面,浏览器显示的地址不会改变
b) Response.Redirect是重定向一个新页面
58、您在什么情况下会用到虚方法?它与接口有什么不同?
a) 子类重新定义父类的某一个方法时,必须把父类的方法定义为virtual
b) 在定义接口中不能有方法体,虚方法可以。
59、post、get的区别?
a) post--表单提交,较安全
b) Get--地址栏提交
60、.Net、ASP.Net、C#、VisualStudio之间的关系是什么?
a) .Net一般指的是.Net Framework,提供了基础的.Net类,这些类可以被任何一种.Net编程语言调用,.NetFramework还提供了CLR(公共语言运行库)、JIT(即时编辑器)、GC(垃圾回收器)等基础功能。
b) ASP.NET是.Net中用来进行Web开发的一种技术,ASP.Net的页面部分写在aspx 文件中,逻辑代码通常通过Code-behind的方式用C#、VB.Net等支持.Net的语言编写。
c) C#是使用最广泛的支持.Net的编程语言。除了C#还有VB.Net、IronPython等。
d) VisualStudio是微软提供的用来进行.Net开发的集成开发环境(IDE),使用VisualStudio可以简化很多工作,不用程序员直接调用csc.exe等命令行进行程序的编译,而且VisualStudio提供了代码自动完成、代码高亮等功能方便开发。除了VisualStudio,还有SharpDevelop、MonoDevelop等免费、开源的IDE,VisualStudioExpress版这个免费版本。
61、Application 、Cookie和 Session 两种会话有什么不同?
a) Application是用来存取整个网站全局的信息,而Session是用来存取与具体某个访问者关联的信息。Cookie是保存在客户端的,机密信息不能保存在Cookie中,只能放小数据;Session是保存在服务器端的,比较安全,可以放大数据。
62、ref与out的区别?
a) ref传进去的参数必须在调用前初始化,out不必
b) ref传进去的参数在函数内部可以直接使用,而out不可
c) ref传进去的参数在函数内部可以不被修改,但out必须在离开函数体前进行赋值
63、C#中索引器是否只能根据数字进行索引?是否允许多个索引器参数?
a) 参数的个数和类型都是任意的
64、是否可以继承String类?
a) 不可以,是密封类不能被继承
65、int、DateTime、string是否可以为null?
a) int、DateTime值类型不能为空,string引用类型可以为null
66、public static const int A = 1;这段代码有错误么?
a) const不能有static修饰。
62、面向对象的语言具有__封装____性、____继承_____性、__多态______性 ?
63、在.Net中所有可序列化的类都被标记为__[serializable]___?
64、接口是一种引用类型,在接口中可以声明(a),但不可以声明公有的域或私有的成员变量。
a) 方法、属性、索引器和事件;
b) 索引器和字段; c) 事件和字段;
65、在ADO.NET中,对于Command对象的ExecuteNonQuery()方法和ExecuteReader()方法,下面叙述错误的是( c)。 a) insert、update、delete等操作的Sql语句主要用ExecuteNonQuery()方法来执行; b) ExecuteNonQuery()方法返回执行Sql语句所影响的行数。 c) Select操作的Sql语句只能由ExecuteReader()方法来执行; d) ExecuteReader()方法返回一个DataReader对象;
66、下列关于C#中索引器理解正确的是(d)
a) 索引器的参数必须是两个或两个以上 b) 索引器的参数类型必须是整数型
c) 索引器没有名字 d) 以上皆非