给点初级的C#面试题
简单的概念题目就得了,常识性的。
算法的不要。
半夜再回来收集题目。
最近要参加个什么 JB 考试。
[解决办法]
http://topic.csdn.net/u/20090208/20/618b1e4e-0c2d-40f9-84c5-0acd39993d9e.html
http://topic.csdn.net/u/20090521/17/12afd0ea-6228-430c-9521-942449313013.html
[解决办法]
参考
参考
参考
还有程序员面试宝典
[解决办法]
3) 交错数组
它是元素是数组的数组,维度和大小可以不同,索引称为:JaggeArray
声明:
int[][] jaggedArray = new int[3][]; 三个元素组成的一维数组,每个元素分又是一个一位数组
初始化:
jaggedArray[0] = new int[5]; 第一个元素:5个元素组成的一维数组
jaggedArray[1] = new int[4]; 。。。
jaggedArray[2] = new int[2];
或:
jaggedArray[0] = new int[] { 1, 3, 5, 7, 9 };
jaggedArray[1] = new int[] { 0, 2, 4, 6 };
jaggedArray[2] = new int[] { 11, 22 };
或:
int[][] jaggedArray = new int[][] 声明的同时初始化
{
new int[] {1,3,5,7,9},
new int[] {0,2,4,6},
new int[] {11,22}
};
或:
int[][] jaggedArray = 简单方法
{
new int[] {1,3,5,7,9},
new int[] {0,2,4,6},
new int[] {11,22}
};
交错数组和多维数组的混合:
int[][,] jaggedArray2 = new int[3][,] 创建一个一维交错数组,包含三个元素,每个元素都是一个二维数组
{
new int[,] { {1,3}, {5,7} },
new int[,] { {0,2}, {4,6}, {8,10} },
new int[,] { {11,22}, {99,88}, {0,9} }
};
访问交错数组:
jaggedArray[0][1] = 1 第一个元素的第一个位置的值;
jaggedArray2[0][1, 0])= 5;
jaggedArray.Length;交错数组中包含的元素的个数;
Array类:
System.Array;
它是所有数组的基类;提供创建、操作、搜索和排序数组的方法;
属性:
Length: Array 的所有维数中元素的总数;
Rank: 获取 Array 的秩(维数);
方法:
CreateInstance(): 初始化 Array 类的新实例;
CopyTo( Array,index ): 将当前一维 Array 的所有元素复制到指定的一维 Array 中;index:制定的Array的起始索引;
Copy(): 将一个 Array 的一部分元素复制到另一个 Array 中,并根据需要执行类型强制转换和装箱
集合类:
System.Collections
ArrayList类:
System.Object
System.Collections.ArrayList
它表示可以按需要动态变化的数组;实现了IList接口
构造函数:
ArrayList list = new ArrayLIst(); 构造一个空实例 容量为0;
ArrayLilst list = new ArrayList(str); 从指定集合复制元素,新创建的实例有该集合相同的容量
ArrayList list = new ArrayList(10); 构造容量为10的新实例;
属性:
Capacity :可存储的元素数
Count : 实际存储的元素数。
Capacity 总是大于或等于 Count,如果添加的count大于capity capity将按count的2倍自动增加;
方法;
Add() 将对象添加到 ArrayList 的结尾处;
AddRange() 将 ICollection 的元素添加到 ArrayList 的末尾;
Hashtable 类:
System.Object
System.Collections.Hashtable
表示键/值对的集合,这些键/值对根据键的哈希代码进行组织;
由于 Hashtable 的每个元素都是一个键/值对,因此元素类型既不是键的类型,也不是值的类型。而是 DictionaryEntry 类型
GetEnumerator()方法返回循环访问 Hashtable 的 IDictionaryEnumerator
IDictionaryEnumerator enu=objtable.GetEnumerator();
//枚举数enu开始会定位在集合中第一个元素前,所以要使用MoveNext() 将 Current 设置为下一个元素。
while(enu.MoveNext())
{
string str =(string)objtable[enu.Key];
//objtable.Remove(enu.Current);
}
// 如果MoveNext移除集合的末尾,枚举数将定位在最后一个元素的后面,该方法放回false
// 调用enu.Reset()方法,在调用movenext方法 可以将current重新指向第一个元素
六:结构
1. 它将一个对象作为内置数据类型,以加快分配,减少引用重载;
2. 定义:
struct 结构名
{
public int num;
public void 方法名();
{
}
public 结构名() //构造函数
{
}
}
结构中可以包括变量方法,构造方法,当构造函数必须要有参数;
实例字段声明不能使用初始值设定项(在声明num时 不能对其赋初值)
它不可继承自类或其他结构,但可以实现接口;
3. 调用:
StructName struc=new StructName(); 但这里struc不是对象
或 StructName struc;
struc.变量名=值;
struct.Method;
4. 结构和类:
结构 类
本身: 值类型继承自(System.ValueType) 引用类型
不可继承其他结构或类 也不能被继承 可以继承他人 也可以被继承
可以实现接口
实例化: 可以不使用new运算符
构造函数: 必须带参数 可以不带参数
成员: 字段声明时候 不能赋值
七:枚举 (Enum,Enumerator缩写)
1. 它是一组已命名的数值常量,有助于定义具有一组特定值的数据类型。
2. 定义:
public enum weekDays
{
Moday,
Thuesday,
Wednesday,
Thursday,
Friday
}
枚举中的值默认为int型,不可以对它制定类型;
其变量值按递增排列,默认从0开始;也可以制定其他值;
3. 遍历枚举元素:
foreach(string str in enum.GetNames(typeof(enumNames)))
{
}
*************************************************************Windows 服务 *********************************************
创建Windows服务:
1.选择编程语言 ,选择”Windows服务” 项目
2.编写OnStart()方法和Onstop()方法的业务逻辑
创建服务安装程序
3. 点右键 添加安装程序
在ServiceInstaller的StartType属性中,可以指定该服务的启动类型
在ServiceProcessInsteller的Account属性中 user表示用登录用户操作该服务,LocalSystem表示是由系统本身操作该服务。
安装Windows服务:
打开cmd:
1.把C:\WINNT\Microsoft.NET\Framework\v1.1.4322 路径下的 InstallUtil.exe文件拖进来
2.空格
3.拖入程序生成的.exe文件
卸载Windows服务:
打开cmd:
1 把C:\WINNT\Microsoft.NET\Framework\v1.1.4322 路径下的 InstallUtil.exe文件拖进来
2 空格 -u 空格
3 拖入程序生成的.exe文件
注:
用到的命名空间:System.ServiceProcess
创建新的服务类时 必须将ServcieBase用作基类
Installer是所有自定义安装程序的基类 可以使用它创建基于事务处理的安装。该类位于: System.Configuration.Intall.Installer 空间下
****************************************************************文件操作*****************************************
File 类:
它提供用于创建、复制、删除、移动和打开文件的静态方法 它里面所有的方法都是静态的
当只执行一个操作时,它的效率比fileinfo要高 所有的 File 方法都要求当前所操作的文件的路径。
FileInfo类:
提供创建、复制、删除、移动和打开文件的实例方法新文件的完全限定名或相对文件名。
FileSteam 类对文本文件的操作:
在打开文件进行保存:
FileStream file=File.Create(文件名);
或者是:
FileStream file=new FileStream(“文件名”,FileMode.Create/CreateNew);
进行写操作:
//将字符内容编码为字符数组
Byte[]con=newUTF8Encoding(true).GetBytes(要写入的内容 )
File.write(con,0,con.length);
File.flush();
进行读操作:
打开流进行读取:
FileStream file=new File.OpenRead(文件名);
或者是 :
objfile=newFileStream(this.openFileDialog.FileName,FileMode.Open);
byte[] buffer=new byte[100]; //声明一个字节数组
while((file.Read(buffer,0,buffer.length)>0) //循环读取
content=new UTF8Encoding(true).GetString(buffer,0,len);; //将指定字节数组解码为字符串。
BufferedStream 类:
BinaryReader 类
BinaryWriter类
实现对话框的过滤效果:
//this.openFileDialog.Filter = "源文件(*.cs)|*.cs|执行程序(*.exe)|*.exe|所有文件(*.*)|*.*";
***********************************************************Window打印***************************************************
Winfom中的打印可以通过两种方式来实现:
1.通过winfrom提供的类实现
2.通过控件实现
通过控件实现的步骤:
1.编写打印逻辑
这理主要用到PrintDocument控件: 它用于描述要打印到信息
也就是处理printDocument的PrintPage事件,在这里面编写的内容是在打印预览界面中显现的内容
PrintPage事件参数中包括HasMorePages属性 表示是否要继续打印
如果要继续添加纸张 则 e.HasMorPages=true;
否则 e.HasMorePages=false
2 选择打印机
这里要用到 PrintDialog控件:它允许用户选择打印机 制定文档中要打印的部分 它需要建PrintDocument控件传递给它
3 选择页面设置
这里需要创建PageSetupDialog 并将PageSettings实例传递给它
This.pageSetupDialog1.showDialog();
4 显示打印预览
创建PrintPreviewDialog 并将printDocument控件传递给它
This.printPreViewDailog1.showDialog();
5 打印
显示打印设置对话框 若确定则 调用PrintDocument的print()方法
If(this.printDialog.showDailog()==DialogResult.ok)
{
This.printDocument.print()
}
调用PrintDocument.Print()方法,将依次出发:
BeginPrint事件 PrintPage 和EndPrint事件
**********************************************C#中的垃圾回收机制**********************************************
当每次使用new创建对象时,运行库会在托管堆中为该对象分配内存,只要托管堆中有空间,该操作就会继续;
.Net Framework 中使用垃圾回收器管理程序的内存分配和释放:
1.垃圾回收器搜索托管代码中的托管对象;
2.尝试终结没有任何引用的对象;
3.释放该对象并回收它的内存
GC类:
System.GC;
该类控制系统垃圾回收器(一种自动回收未使用内存的服务),它解决了内存泄露的问题;
属性:
1)提供系统可用内存总量;
2)分配给对象的内存周期类别;
方法:
1)何时对对象进行垃圾回收;
2)何时释放该对象所占资源;
非托管资源的处理:
垃圾回收器可以跟踪封装非托管资源的对象的生存期,但它不了解具体如何清理这些资源;
使用 Object.Finalize 方法:
它允许对象在垃圾回收器回收该对象使用的内存时适当清理其非托管资源
Dispose 方法可以被多次调用而不引发任何异常;
****************************************************C#中的异常************************************************************
程序的状态的模式:
设计模式;
调试模式;
运行模式;
程序的错误类型:
语法错误:编译器无法理解代码;
运行时错误:使用异常处理;----------->异常
逻辑错误:使用但不调试;------------>调试
生成程序的模式:
调试模式(Debug模式):可以重复编译程序,直到成功运行;
发布模式(Release模式):设置断点无效
一:异常:
异常是程序运行时发生的错误;
异常类:
Excetion: 所有异常的基类
SystemException:提供系统异常和应用程序之间的区别
ApplicationException: 由用户程序引发,自定义异常要从该类继承
System.Object
System.Exception
System.SystemException
System.ApplicationException
引发异常:
程序运行过程中触发某个异常条件,引发异常;
使用throw语句显示引发异常;
异常处理:
try{}
catch{ throw }
finlly{}
二:调试
使用调试器:不必插入输出语句来输出变量的值;
快捷键:
F9:设置断点;F10:逐过程调试;F11:逐语句调试(单步调试)
调试窗口:
局部变量窗口:
监视窗口:
快数监视窗口:
即时窗口:
三:测试
单元测试:
它测试隔离的单元或模块,它是最小的测试软件块;
单元测试工具:Nnit;
集成测试:
测试整个集成应用程序;
集成测试方法:自顶向下法;自低向上法;伞形法;
[解决办法]
1 :维护数据库的完整性、一致性、你喜欢用触发器还是自写业务逻辑?为什么 答:尽可能用约束(包括CHECK、主键、唯一键、外键、非空字段)实现,这种方式的效率最好;其次用触发器,这种方式可以保证无论何种业务系统访问数据库都能维持数据库的完整性、一致性;最后再考虑用自写业务逻辑实现,但这种方式效率最低、编程最复杂,当为下下之策2 : ADO。NET相对于ADO等主要有什么改进?答 ADO数据以Recordset 形式存储 ADO.NET以DataSet形式存储
Recordset对数据库持续连接访问ADO.NET提供对数据库断开连接
ADO.NET与ADO相比,优势在于提供了数据集和数据适配器,有利于实现分布式处理,降低对数据库服务器资源的消耗。3 : ASP。NET与ASP相比,主要有哪些进步?答 asp.net 可以使用强类型语言
页面是编译,执行速度快, 增加安全性和可靠性
,通过继承机制来支持代码的重用,提供声明性服务器控件减少代码行数
Asp需要解释,执行速度慢,重用代码不方便,没有调试机制 4:C#中的委托是什么?事件是不是一种委托? 答 委托本质上是一种“方法接口”,它相当于C/C++中的函数指针,当然它比函数指针安全,在C#中通常用于事件处理。与JAVA相比,可以避免使用大量小粒度的匿名类。(不过,也许微软就是使用类似于JAVA的匿名类实现委托的,只不过从字面上看起不是那么回事罢了,谁知道呢?) 事件不是委托,不过由于事件的性质决定了处理它的程序逻辑能访问的参数,因此,在C#中处理事件的逻辑都包装为委托(一种“方法接口”)。实际上,如果你处理自定义的事件,就像JAVA中那样用接口实现也是可以的,不过这么做在C#一般没有什么特别的好处。5:new有几种用法第一种:new Class();第二种:覆盖方法public new XXXX(){}第三种:new 约束指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数。6:如何把一个array复制到arrayList里答 foreach( object o in array )arrayList.Add(o);7:datagrid.datasouse可以连接什么数据源答 [dataset,datatable,dataview] dataset,datatable,dataview , IList8:概述反射和序列化答 反射:程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性答 序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。在另一端,反序列化将从该流重新构造对象。9:概述o/r mapping 的原理答 利用反射,配置 将类于数据库表映射10:类成员有( )种可访问形式答 可访问性:public ,protected ,private,internal11:用sealed修饰的类有什么特点答 sealed 修饰符用于防止从所修饰的类派生出其它类。如果一个密封类被指定为其他类的基类,则会发生编译时错误。密封类不能同时为抽象类。
sealed 修饰符主要用于防止非有意的派生,但是它还能促使某些运行时优化。具体说来,由于密封类永远不会有任何派生类,所以对密封类的实例的虚拟函数成员的调用可以转换为非虚拟调用来处理。11:列举ADO.NET中的五个主要对象,并简单描述connection,command,dataReader,dataAdapter,dataset ...12:执行下面代码后:String strTemp ="abcdefg 某某某";Int i System.Text.Encoding.Default.GetBytes(strTemp).Length;Int j = strTemp.Length;问:i=(14 ) ;j=(11 )i=(14 ) ;j=(11 ) 中文两个字节13:C#中,string str = null 与 string str ="",请尽量用文字说明区别。(要点:说明详细的内存空间分配)答 string str = null 是不分配内存空间,而string str = "" 给它分配长度为空字符串的内存空间。 14:概述.NET里对 remoting 和 webservice 两项技术的理解和实际中的应用。答 远程逻辑调用,remoing接口只能用在.net中15:什么是code-behind技术答 aspx and cs 代码隐藏16:概述三层结构体系
答 表示层 数据层 业务层 17:用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层?
答:一般为3层
数据访问层,业务层,表示层。
数据访问层对数据库进行增删查改。
业务层一般分为二层,业务表观层实现与表示层的沟通,业务规则层实现用户密码的安全等。
表示层为了与用户交互例如用户添加表单。
优点: 分工明确,条理清晰,易于调试,而且具有可扩展性。
缺点: 增加成本。18:什么是ASP.net中的用户控件答:用户控件就是.ascx扩展名的东西喽,可以拖到不同的页面中调用,以节省代码.比如登陆可能在多个页面上有,就可以做成用户控件,但是有一个问题就是用户控件拖到不同级别的目录下后里面的图片等的相对路径会变得不准确,需要自已写方法调整.19:什么叫应用程序域?什么是受管制的代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?答 应用程序域可以理解为一种轻量级进程。起到安全的作用。占用资源小
受管制的代码:unsafe:非托管代码。不经过CLR运行。
强类型系统 RTTI:类型识别系统。
装箱就是把值类型到引用类型的转换
拆箱就是引用类型到值类型的转换
重载 方法名相同 不用个数的参数或者指定不同参数类型
CTS:通用语言系统。CLS:通用语言规范。CLR:公共语言运行库。
class box{
int aa(object i)
{}
object bb()
{}
}
int bb=5
new box().aa(bb) //装箱
int conver=(int)new box().zz(); //拆箱
//重载
public void aaa(int rad)
{ }
public void aaa(int len,int bre )
{ }
public void aaa(sting str)
{ }
20:列举一下你所了解的XML技术及其应用答:xml可以统一数据格式,XML可是好东西,保存配置,站与站之间的交流,WEB SERVICE都要用它.
21 :ADO.net中常用的对象有哪些?分别描述一下。答:Connection 对象用于在应用程序和数据库之间的连接
Command 可以检索和操纵数据库中的数据
DataAdapter对象充当DataSet和数据源之间用于检索和保存数据的桥接器
DataSet 对象从数据库检索的数据可以存储在其中能够以XML形式保存
DataReader 是查询结果的一种只进。只读的视图 不具有DataSet的任何复杂功能
所以可以加快访问和查看数据的速度 不提供断开式访问22:如何理解委托?答:据说相当于函数指针,定义了委托就可以在不调用原方法名称的情况下调用那个方法.
msdn2005中是这样解释的:
委托具有以下特点:委托类似于 C++ 函数指针,但它是类型安全的。
委托允许将方法作为参数进行传递。委托可用于定义回调方法
委托可以链接在一起;例如,可以对一个事件调用多个方法。
方法不需要与委托签名精确匹配。23:C#中的委托是什么?事件是不是一种委托?答 委托可以把一个方法作为参数代入另一个方法。
委托可以理解为指向一个函数的引用。
是,是一种特殊的委托
24:UDP连接和TCP连接的异同。答: udp前者只管传,不管数据到不到,无须建立连接. tcp后者保证传输的数据准确,须要连结.25:ASP.net的身份验证方式有哪些?分别是什么原理?答:Forms认证,windows集成认证等,passport验证 None26:进程和线程分别怎么理解?答:进程是老子,线程是儿子,没有老子就没有儿子,一个老子可以有多个儿子.一个儿子可以成为别人的儿子,一个老子也可以为别的老子生儿子.27:什么是code-Behind技术。答:代码分离,这是个明智的东西,或者可以理解成HTML代码写在前台,C#代码写在后台.当然前台也有脚本,类的调用等,其实写在一起也是可以的.28:net中读写XML的类都归属于哪些命名空间?
答:System.Xml 29解释一下UDDI、WSDL的意义及其作用答:UDDI 用于注册各个服务提供商提供的服务 以便可以共享它们 它还有助于WEB服务客户或web用户查找该Web服务
wsdl 是web服务描述语言(web Services Description Language)30:什么是SOAP,有哪些应用。答:SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息并执行远程过程调用的协议,是一个基于XML的协议。使用SOAP,不用考虑任何特定的传输协议(最常用的还是HTTP协议),可以允许任何类型的对象或代码,在任何平台上,以任何一直语言相互通信。这种相互通信采用的是XML格式的消息,具体请看
31:如何理解.net中的垃圾回收机制。答 GC?对象创建了总要清除啊,不然内存哪够用?32:常用的调用webservice方法有哪些?答 HTTP-get Http-post Http-soap 33 概述.NET里对 remoting 和 webservice 两项技术的理解和实际中的应用。答 远程逻辑调用,remoing接口只能用在.net中 34: 简述 private、 protected、 public、 internal 修饰符的访问权限。
答 private : 私有成员, 在类的内部才可以访问。
protected : 保护成员,该类内部和继承类中可以访问。
public : 公共成员,完全公开,没有访问限制。
internal: 在同一命名空间内可以访问。 35:列举ASP.NET 页面之间传递值的几种方式。
答. 1.使用QueryString,
源页面
string url;
url="anotherwebform.aspx?name=" + TextBox1.Text
Response.Redirect(url); 目标页面
Label1.Text=Request.QueryString["name"]; 2.使用Session变量
源页面
Session["name"]=TextBox1.Text;
Session["email"]=TextBox2.Text;
Server.Transfer("anotherwebform.aspx"); 目标页面
Label1.Text=Session["name"].ToString();
Label2.Text=Session["email"].ToString();
Session.Remove("name");
Session.Remove("email"); 3.使用Server.Transfer
源页面代码:
public string Name
{
get {
return TextBox1.Text; }
}
//然后调用Server.Transfer方法
private void Button1_Click
(object sender, System.EventArgs e)
{
Server.Transfer("anotherwebform.aspx");
} 目标页面代码:
private void Page_Load
(object sender, System.EventArgs e)
{
WebForm1 wf1;
wf1=(WebForm1)Context.Handler;
Label1.Text=wf1.Name;
}