写在前面
一题一题过,基本都亲自测试;不定期收录更新,欢迎拍砖(请轻拍~)。
跳槽是真的累,要准备笔试面试~
本文大纲:
- 填空或简述题
- 程序或编程题
- 数据库题
一、填空或简述题:
1. c#中错误处理机制有哪些
答:Try catch finally throw;
2. public/protect/private/internal修饰符的区别
答:Public:公共的,都能访问;
Protect:受保护的,只有该类和派生类能访问;
Private:私有的,只有该类可以访问;
Internal:内部的,只能在包含它的程序集中访问;
3. 大量数据(如3000万条数据)并发处理时,有哪几种机制
答:存储过程或事务。取得最大标识的时候同时更新,注意主键不是自增量方式。这种方法并发的时候是不会重复主键的,
取得最大标识要有一个存储过程来获取。--我也不知道讲的什么鬼!
4. String/StringBuilder的异同
答:string,是一个不可变的数据类型,一旦对字符串对象进行了初始化,该字符串对象就不能改变了。修改字符串内容的方法
和运算符实际上是创建一个新的字符串;
stringbuilder,分配好内存,对字符串的修改就在赋予stringbuilder实例的存储单元中进行。
示例代码:
1 string s1 = "a"; 2 string s2 = s1; 3 s1 += "b"; 4 // 输出结果:ab a 5 Console.WriteLine("使用string定义的变量1和2此时的值分别是:{0} {1}", s1, s2); 6 StringBuilder sb1 = new StringBuilder("a"); 7 StringBuilder sb2 = sb1; 8 sb1.Append("b"); 9 // 输出结果:ab ab 10 Console.WriteLine("使用StringBuilder定义的变量1和2此时的值分别是:{0} {1}", sb1.ToString(), sb2.ToString()); 11 Console.ReadLine();
示例:string 和 StringBuilder对比
5.根据线程安全的相关知识,分析以下代码,当调用test方法时i>10时是否会引起死锁?并简要说明理由。
(和第4题对比看)
public void test(int i)
{
lock(this)
{
if (i>10)
{
i--;
test(i);
}
}
}
答:不会发生死锁,(但有一点int是按值传递的,所以每次改变的都只是一个副本,因此不会出现死锁。但如果把int换做一个object,那么死锁会发生;
6. 解释string str=null/string str=""
答:str=null,声明一个字符串而不分内存空间;
str="",声明一个字符串并且分配了内存空间赋值为一个空字符串;
7. ASP.NET页面间传递参数有哪几种方式
答:QueryString、Session、Cookie、Application和Server.Transfer;
简单说明:
A. QueryString:将一个或者多个安全性不高的参数连接到目标URL的后面使用&字符隔开:
源页面:Response.Redirect(带参数的URL)跳转;
目标页:Request.Query[“参数名称”]取出参数;
B. Session:消耗服务器资源,存放在服务器端,针对单个用户,全局;
C. Cookie:存放在客户端:
源页面:HttpCookie objCookie = new HttpCookie("myCookie","Hello,Cookie!");
Response.Cookies.Add(cookie);
目标页:string myName1Value = Request.Cookies[ "myCookie" ].Value;
D.Application:适用于所有用户,全局:
源页面:Application["name"] = Label1.Text;
目标页:string name;
Application.Lock();
name = Application["name"].ToString();
Application.UnLock();
E. Server.Transfer:Server.Transfer是从当前的ASPX页面转到新的ASPX页面,服务器端执行新页并输出,在新页面中通过Context.Handler来获得前一个页面传递的各种数据类型的值、表单数据、QueryString.由于重定向完全在服务器端完成,所以客户端浏览器中的URL地址是不会改变的。调用Server.Transfer时,当前的ASPX页面终止执行,执行流程转入另一个ASPX页面,但新的ASPX页面仍使用前一ASPX页面创建的应答流。
源页面:public string Name
{
get{ return Label1.Text;}
}
private void Button1_Click(object sender, System.EventArgs e)
{
Server.Transfer("b.aspx");
}
目标页:a newWeb; //实例a窗体
newWeb = (source)Context.Handler;
string name;
name = newWeb.Name;
8. 解释重载/覆盖:
答:重载:指的是在一个类对相同名称的方法或者函数允许有多次定义,但是定义时包含有不同类型的参数或者不同个数的参数,称为方法的重载;
覆盖(重写):关键字override,指的是子类中的方法对基类中同名的方法(这里通常是虚方法或者抽象方法)的覆盖;
9. Web Services的含义/UDDI的含义
答:Web服务:是利用SOAP在HTTP上执行远程方法调用的一种新方法;
UDDI:统一描述发现和集成(UDDI)提供一种发布和查找服务描述的方法;--我也不知道讲的什么鬼!
10.虚函数/抽象函数各自的定义
答:虚函数:由virtual声明,他允许在派生类中被重写(覆盖)
public class myclass
{
public virtual int myint()
{
函数体;
}
}
class myclass1:myclass
{
public override int myint()
{
函数体1;
}
}
抽象类、抽象函数:由abstract关键字声明,在抽象类中可以定义抽象方法,抽象方法沒有具体的执行代码,所以派生类必须通过重写(覆盖)来实现他:
public abstract class myclass
{
public abstract int myint();
}
public class myclass1:myclass
{
public override int myint()
{
函数体;
}
}
11.接口和类的异同
答:接口类:由interface关键字声明,是特殊的抽象类,是方法、属性、事件和索引符的组合,没有字段,其成员没有执行代码,没有构造函数,不允许进行运算符重载,接口和他的人员没有任何访问修饰符,他总是公共的,不能声明为虚拟或静态,继承自接口的派生类要实现接口中的所有的方法。
接口是负责功能的定义,项目中通过接口来规范类,操作类以及抽象类的概念! 而类是负责功能的具体实现!
在类中也有抽象类的定义,抽象类与接口的区别在于:
抽象类是一个不完全的类,类里面有抽象的方法,属性,也可以有具体的方法和属性,需要进一步的专业化。
但接口是一个行为的规范,里面的所有东西都是抽象的!
一个类只可以继承一个基类也就是父类,但可以实现多个接口。
12.C#中的委托是什么?事件是不是一种委托?
答:委托:委托可以理解为指向一个函数的指针;
一般使用委托的步骤:
A.定义或者声明一个委托,通常指一个函数的原型(包含返回值、参数的类型和个数),但需要使用deletegate关键字,通常在类的外部定义:
Public deletegate 返回值类型 自定义名称(参数类型和个数);
B.根据委托定义具体的函数。可能有多个;
C.创建或者实例化委托对象,并关联实际需要使用的具体方法;
D.使用委托调用方法,而不是直接调用方法;
事件:事件是一种特殊的委托;
13.using/new各自的意义
答:Using:引入名称空间或者说使用非托管资源;
New:新建实例或隐藏父类方法;
14.DataReader/DataSet区别
答:Dataset:表示一个数据集,是数据在内存中的缓存。 可以包括多个表;DatSet 连接数据库时是非面向连接的。把表全部读到Sql中的缓冲池,并断开与数据库的连接;
Datareader:连接数据库时是面向连接的。读表时,只能向前读取,读完数据后由用户决定是否断开连接。
15.什么叫应用程序域?
答:应用程序域可以理解为一种轻量级进程。起到安全的作用。占用资源小。
16.CTS、CLS、CLR分别作何解释?
答:CTS:Common Type System,通用类型系统;
CLS:Common Language Specification,通用语言规范;
CLR:Common Language Runtime,公共语言运行库。
17.什么是装箱和拆箱?
答:从值类型接口转换到引用类型装箱;
从引用类型转换到值类型拆箱;
18.什么是非托管代码?
答:unsafe:非托管代码。不经过CLR运行。
19.常用的调用WebService的方法有哪些?
答:A.使用WSDL.exe命令行工具;
B.使用VS.NET中的Add Web Reference菜单选项;
20.net Remoting 的工作原理是什么?
答:服务器端向客户端发送一个进程编号,一个程序域编号,以确定对象的位置。
21.公司要求开发一个继承System.Windows.Forms.ListView类的组件,要求达到以下的特殊功能:点击ListView各列列头时,能按照点击列的每行值进行重排视图中的所有行 (排序的方式如DataGrid相似)。根据您的知识,请简要谈一下您的思路
答:根据点击的列头,包该列的ID取出,按照该ID排序后,再绑定到ListView中。
22.String s = new String("xyz");创建了几个String Object?
答:两个对象,一个是“xyx”,一个是指向“xyx”的引用对像s;
23.启动一个线程是用run()还是start()?
答:启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程;
二、程序或编程题:
1.一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少, 用递归算法实现
答:
1 /// <summary> 2 /// 斐波拉契数列:递归算法示例 3 /// </summary> 4 /// <param name="n">第N位数字</param> 5 /// <returns></returns> 6 private static int MyFoo(int n) 7 { 8 int result = 0; 9 if (n <= 0) 10 { 11 result = 0; 12 } 13 else if (n == 1 && n == 2) 14 { 15 result = 1; 16 } 17 else 18 { 19 result = MyFoo(n - 1) + MyFoo(n - 2); 20 } 21 return result; 22 }
示例:递归算法方法体
方法调用:int result = MyFoo(30);
2.请编程实现一个冒泡排序算法
答:
1 /// <summary> 2 /// 简单冒泡排序(这里为倒序排列): 3 /// </summary> 4 /// <param name="array">自定义数组</param> 5 /// <returns></returns> 6 private static int[] MyBubble(int[] array) 7 { 8 if (array != null && array.Length != 0) 9 { 10 for (int i = 0; i < array.Length; i++) 11 { 12 for (int j = i + 1; j < array.Length; j++) 13 { 14 if (array[i] < array[j]) 15 { 16 int temp = array[i]; 17 array[i] = array[j]; 18 array[j] = temp; 19 } 20 } 21 } 22 } 23 return array; 24 }
示例:简单冒泡排序算法方法体
调用方法:// 输出结果:9 3 1 -1 -5
int[] array = new int[] { 1, -1, 3, -5, 9 };
array = MyBubble(array);
string sResult = string.Empty;
foreach (int num in array)
{
sResult += num.ToString() + " ";
}
Console.WriteLine(sResult);
Console.ReadLine();
3.请编程遍历页面上所有TextBox控件并给它赋值为string.Empty?
答:
C#代码示例:
1 foreach (Control control in this.Controls) 2 { 3 if (control is TextBox) 4 { 5 tb = (TextBox)control; 6 tb.Text = String.Empty ; 7 } 8 }
示例:遍历清空所有文本框的值
JQuery代码示例:
1 <div> 2 <input type="text" id="text0" class="myClass" value="1" /> 3 <input type="text" id="text1" class="myClass" value="2" /> 4 <input type="text" id="text2" class="myClass" value="3" /> 5 <input type="text" id="text3" class="myClass" value="4" /> 6 <input type="text" id="text4" class="myClass" value="5" /> 7 </div> 8 <div> 9 <input type="button" id="btnClear" value="清空所有文本框的信息" /> 10 </div>
示例:前台控件代码
1 <script src="JQuery脚本路径" type="text/javascript"></script> 2 <script type="text/javascript"> 3 $(document).ready(function () { 4 $("#btnClear").bind("click", function () { 5 var textBoxs = $(".myClass"); 6 if (textBoxs != null && textBoxs != undefined) { 7 $.each(textBoxs, function (index, textBox) { 8 $("#" + textBox.id).val(""); 9 }) 10 } 11 }); 12 }); 13 </script>
示例:遍历清空所有文本框的值
4.求以下表达式的值,写出您想到的一种或几种实现方法: 1-2+3-4+……+m
答:两两一组求和,M的奇偶性:
1 if(m%2 == 1) 2 { 3 S = (m + 1) / 2; 4 } 5 else 6 { 7 S = -m / 2; 8 }
示例:两两一组求和
5.当使用new B()创建B的实例时,产生什么输出
1 using System; 2 class A 3 { 4 public A() 5 { 6 PrintFields(); 7 } 8 public virtual void PrintFields(){} 9 } 10 class B:A 11 { 12 int x=1; 13 int y; 14 public B() 15 { 16 y=-1; 17 } 18 public override void PrintFields() 19 { 20 Console.WriteLine("x={0},y={1}",x,y); 21 } 22 }
题目程序代码
答:输出X=1,Y=0;
通过调试可知,声明B对象时,由于B继承A则进入A类的初始化,A初始化时会调用PrintFields方法,此时该方法已被B重写,故输出X=1,Y=0;
紧接着初始化B,这时Y=-1,但是初始化完成后并没有再调用PrintFields方法,程序结束。
6.给定以下XML文件,完成算法流程图
1 <?xml version="1.0" encoding="utf-8" ?> 2 <FileSystem> 3 <DriverC> 4 <Dir DirName="MSDOS622"> 5 <File FileName="Command.com"></File> 6 </Dir> 7 <File FileName="MSDOS.SYS"></File> 8 <File FileName="IO.SYS"></File> 9 </DriverC> 10 </FileSystem>
题目给定的XML文件代码
请画出遍历所有文件名(FileName)的流程图(请使用递归算法)
答:大部分转帖的答案不知道是什么鬼,这个是我自己写的。
1 /// <summary> 2 /// 在当前节点下遍历并获取文件名 3 /// </summary> 4 /// <param name="curNode">当前节点</param> 5 /// <returns></returns> 6 private static string GetFileName(XmlNode curNode) 7 { 8 string sFileName = string.Empty; 9 if (curNode != null) 10 { 11 // 取出当前节点下所有子节点 12 XmlNodeList childNodes = curNode.ChildNodes; 13 if (childNodes != null && childNodes.Count != 0) 14 { 15 // 遍历所有子节点 16 foreach (XmlNode node in childNodes) 17 { 18 if (node != null) 19 { 20 if (node.Name != "File") 21 { 22 sFileName += GetFileName(node); 23 } 24 else 25 { 26 // 取出文件名 27 sFileName += ((XmlElement)node).GetAttribute("FileName") + " "; 28 } 29 } 30 } 31 } 32 } 33 return sFileName; 34 }
示例:从当前节点开始遍历XML并获取文件名
调用方法://输出为: 文件名是:Command.com MSDOS.SYS IO.SYS
1 private static void GetFileNames() 2 { 3 string sFileNames = string.Empty; 4 XmlDocument xml = new XmlDocument(); 5 xml.Load(“文件路径”); 6 if (xml != null) 7 { 8 // 获取文件名:这里跳过了XML第一段 “<?xml version="1.0" encoding="utf-8" ?>” 9 sFileNames = GetFileName(xml.FirstChild.NextSibling); 10 } 11 Console.WriteLine("文件名是:" + sFileNames); 12 Console.ReadLine(); 13 }
示例:调用方法
三、数据库题: