C#面试题Word格式.docx
《C#面试题Word格式.docx》由会员分享,可在线阅读,更多相关《C#面试题Word格式.docx(29页珍藏版)》请在冰豆网上搜索。
();
2)设置父窗体属性:
isMdiContainer=true;
3、模式窗体和非模式窗体的区别
模式窗体:
();
有返回值:
DialogResult;
程序会中断,主窗体不能激活,必须关闭模式窗体才能激活主窗体,只能show出一个
非模式窗体:
无返回值,程序不会中断;
可以show出多个
4、使用第三方类传递窗体间的数据(代码演示)
publicclassUserHelpper
{
publicstaticstringloginId="
"
;
etFramework和DateSet
2、数据提供者程序有哪些
3、连接字符串的写法(两种)
DataSource=.\SQLEXPRESS;
InitialCatalog=数据库名;
Integratedsecurity=true;
server=.\sqlexpress;
database=数据库名;
uid=用户名;
password=密码"
4、Connection对象的属性和方法:
数据库连接对象
属性:
state连接状态,DataBase获取连接对象的数据库名称,DataSource连接对象的实例名
方法:
Open()/Close()打开/关闭数据库,Dispose()释放连接资源,ChangeDatabase()为打开的当前连接对象更改数据库名。
5、异常处理各关键字的作用
try:
可能发生异常的代码块
catch:
捕获到何种异常,如何去处理,可以跟多个catch块,但子类异常必须写在父类异常的前面
finally:
不管有没有异常都将执行的代码块
6、Command对象的属性和方法:
SQL语句执行命令
CommandText获取或设置要对数据源执行的Transact-SQL语句、表名或存储过程。
Connection获取或设置SqlCommand的此实例使用的SqlConnection
ExecuteNonQuery()执行增,删,改语句,并返回受影响行数;
ExecuteScalar()执行查询,返回结果的第一行第一列,忽略其他列或行;
ExecuteReader()执行查询,返回DataReader对象
Ch7:
1、DataReader对象的主要属性和方法
HasRows有没有读取到DataReader中的数据;
IsClosed是否已关闭DataReader对象
Read()读取一行数据;
GetString()/GetDouble()…获取何种类型的数据值;
Close()关闭DataReader对象;
IsDBNull()获取一个值,用于指示列中是否包含不存在的或缺少的值
2、请写出获取并使用DataReader对象的步骤
1)建立数据库连接conn=new…Connection(…);
2)创建Command对象cmd=new…Command(sql,conn);
3)执行SQL查询命令sdr=cmd.ExecuteReader();
4)处理数据while()){inti=(0);
}
Ch8:
1、请写出DataSet(临时数据库)的内部结构(图
2、写出填充一个DataSet的步骤
3、数据集的工作原理(图)
4、如何将数据集中的数据保存到数据库,请写出步骤
S2深入.NET
Ch1:
1、画出.NET框架的结构(图)
Framework类库:
(Web和WebService)、WinForms、和XML类、基本框架类。
CLR:
CLS和CTS。
2、解释CTS(CommonTypeSystem通用类型系统)和CLS(CommonLanguageSpecification公共语言规范)的含义
CTS:
解决不同语言的数据类型不同的问题。
CLS:
实现多种语言之间的互操作性。
3、C#编译器
?
画出.NET编译过程(图)
C#代码
Microsoft中间语言
(MSIL)
平台专用代码
代码
编译器
CLR
JIT编译器
4、解释.NET解决了DLL灾难
5、解释垃圾回收机制工作原理(回去查资料)
垃圾回收器是用来管理应用程序的内存分配和释放的。
当一个应用程序在运行的时候,垃圾回收器设置了一个托管堆。
每次当开发人员使用new运算符创建对象时,运行库都从托管堆为该对象分配内存。
新创建的对象被放在上次创建的对象之后。
垃圾回收器保存了一个指针,该指针总是指向托管堆中最后一个对象之后的内存空间。
当新的对象被产生时,运行库就知道应该将新的对象放在内存的什么地方。
当垃圾回收器的指针指向托管堆以外的内存空间时,就需要回收内存中的垃圾了。
在这个过程中,垃圾回收器首先假设在托管堆中所有的对象都需要被回收。
然后它在托管堆中寻找被根对象引用的对象(根对象就是全局,静态或处于活动中的局部变量以及寄存器指向的对象),找到后将它们加入一个有效对象的列表中,并在已经搜索过的对象中寻找是否有对象被新加入的有效对象引用。
直到垃圾回收器检查完所有的对象后,就有一份根对象和根对象直接或间接引用了的对象的列表,而其它没有在表中的对象就被从内存中回收
6、CLR主要用途(CommonLanguageRuntime公共语言运行时)
是所有.Net应用程序运行时的环境,所有应用程序都要使用的编程基础,它如同一个支持.Net应用程序运行和开发的虚拟机。
1、什么是类和对象
类:
具有相同特征工共同行为的一级对象的集合。
是一个模子。
对象:
是真实的实体。
它们的关系:
由对象归纳为类,是归纳对象共性的过程;
在类的基础上,将状态和行为实体化为对象的过程称为实例化。
2、什么是封装
封装是面向对象的三大特性之一,用于隐藏内部实现,对外只暴露对类的基本操作,而不会让其他对象影响类的实现。
3、什么是函数重载
一个类中两个以上的方法,名字相同使用的参数类型或参数个数不同,称为重载。
其方式包括两种:
参数不同类型的重载和参数个数不同的重载。
4、解释静态方法和实例方法的差别(表2-2)
实例方法:
需要使用类的实例对象来调用的方法
静态方法:
通过“类名.方法名”来调用的方法
不需要static关键字
Static关键字修饰
实例对象调用
类名调用,不需要new出来
可以直接访问静态成员
可以访问静态成员
可以直接访问实例成员
不可以直接访问实例成员
可以直接调用实例方法和静态方法
不能直接调用实例方法
实例化对象时初始化
调用前初始化
5、写出Pascal和Camel命名法的意义
Pascal命名法:
类、属性、方法(公有成员)的命名,单词的第一个字母要大写。
Camel命名法:
变量(私有成员)的命名,首字母小写,后面的单词首字母大写。
只通过名称就能猜出此变量的含义,采取有意义的单词。
6、写出out与ref的区别:
都可以将参数值的更改保留
out传递参数:
侧重于输出,必须对out参数先进行赋值。
ref传递参数:
侧重于修改,可以不先赋值。
Ch3:
1、说明枚举的作用
枚举可以避免不合理的赋值,它表示一组有限的值,对可能的值进行约束;
更易于输入,使代码更清晰,允许描述性的名称表示数据,使用时直观方便。
2、写出如何用枚举来进行复合状态判断(上课扩展):
定义性别枚举:
publicenumGender
male=0,female=1
oInt32(null);
3、结构和类的差别(表3-1)
结构struct
类class
值类型
引用类型
不能被继承
可以被继承
可以有默认构造函数
添加的构造函数必须带参数
可以添加无参的构造函数
创建对象可以不用new
创建对象必须使用new
在结构中给字段赋值是错误的
类中可以给字段赋值,不能写属性
都可以包含字段、方法,也都可以实现接口
4、什么是值类型,什么是引用类型
值类型:
每个值类型的对象都有一个独立的内存区域保存自己的值,源自,主要包括基本数据类型、结构、枚举
引用类型:
存储的是对象的引用,源自,主要包括类类型、接口类型、数组等
5、inti=0;
objecto=newobject();
运行前两句的内存图
栈区:
inti
100H
newObject()
堆区:
Objecto=100H
6、什么是装箱拆箱并举例说明
装箱:
把值类型转换成引用类型的过程inti=10;
objectobj=i;
拆箱:
由引用类型转换为值类型的过程intj=(int)obj;
7、请创建一个学生类的类关系图
Ch4:
1、arrayList和hashtable的区别点,写出两种集合的常用方法
ArrayList:
实现IList接口,IList继承自ICollection
HashTable:
键-值key-value
使用大小可按需动态增加的数组实现
表示键/值对的集合,这些键/值对根据键的哈希代码进行组织
只能通过数字索引访问元素
可以通过数字索引和key访问元素
常用方法:
Add()、Contains()、Remove()、RemoveAt()、ToArray()、Clear();
Count、Item
Add()、ContainsKey()、ContainsValue()、Remove()、Clear();
Keys、Values、Count、Item
2、什么是泛型,解释泛型的含义及优点
泛型:
将类型参数化,通过泛型可以定义类型安全的数据类型,保证了类型的安全性,其性能更高。
如:
List<
int>
list=newList<
访问时不用再进行类型转换,添加元素时也只能添加int类型的数据。
1、文件读写流程
1)创建文件流:
FileStreamfs=newFileStream(@"
C:
\"
;
2)创建写入器:
StreamWritersw=newStreamWriter(fs);
/读取器:
StreamReadersr
3)写入内容:
("
aaaaaa"
/stringcontent=();
4)关闭写入器:
/();
5)关闭文件流:
2、静态类和非静态类的区别
静态类
非静态类
用static修饰
不用static修饰
只包含静态成员
可以包含静态成员,也可以包含非静态成员
不可以包含实例成员
可以包含实例成员
使用类名调用静态成员:
类名.方法名()
使用实例对象调用非静态成员
不能被实例化
可以被实例化
不能包含实例构造函数
可以包含实例构造函数
3、什么是XML:
eXtensibleMarkupLanguage可扩展标记性语言
XML用于描述数据,每对标记称为节点,是成对出现的,其各个节点可以自由地扩展,节点区分大小写
4、写出xmlDocument、xmlNode的常用属性和方法
xmlDocument对象可表示整个XML文档:
Load()读取整个XML结构、ChildNodes获取所有子节点、DocumentElement获取根节点。
xmlNode表示XML中的节点:
InnerText当前节点的内容、Name当前节点的名字、ChildNodes当前节点的所有子节点。
Ch6:
1、什么是继承
一个类可以继承自另一个类,比如学生类Student和老师类Teacher继承自Person类,被继承的类称为父类或基类,继承自其他类的类称为子类或派生类。
继承关系在类图中用箭头表示,箭头指向父类。
它们符合is-a的关系,即子类isa父类。
继承中的方法重写,虚方法等。
用base关键字可以从子类访问父类的属性与方法。
2、请写出public、private、protected的区别(表6-1)
修饰符
类内部
子类
其他类
public
可以
private
不可以
protected
1、什么是抽象类,什么是抽象方法
抽象方法是一个没有实现的方法,在定义方法时增加关键字abstract声明,它没有包括方法执行逻辑的方法体。
publicabstractvoidSayHi();
含有抽象方法的类称为抽象类。
但抽象类的方法并不一定全是抽象方法,也可以包括具体方法。
抽象类不能被实例化,也不能是密封或静态的。
2、Override和new的区别
override:
在子类或实现类中用来重写抽象方法或虚方法。
将覆盖父类的方法。
new:
在子类的用new关键字修饰的方法,将会是一个新的方法,它不会覆盖父类的方法。
3、解释什么是里氏替换原则(左父右子)
一般发生在多态的情况下。
父类类型对象=new子类类型();
4、is和as的区别
is:
用于判断类型时,返回true/false。
as:
用于两个对象之间的类型转换,当转换失败时,返回null,不会引发异常。
5、解释关键字virtual的含义
Virtual用来修饰虚方法,虚方法可以有具体的实现,也可以被子类重写。
6、请画图说明简单工厂设计模式
父类产品
子类产品A
子类产品B
子类产品C
工厂
客户
7、虚方法和抽象方法的区别
虚方法
抽象方法
用virtual修饰
用abstract修饰
要有方法体,哪怕只有一个分号
不能有方法体
可以被子类override
必须被子类override
除了密封类外都可以写
只能在抽象类中
8、面向对象的三大特性是什么并简述每个原则的基本功能
三在特征:
封装、继承、多态。
1、请解释接口和抽象类的异同点(表8-1)
接口
抽象类
用interface修饰
实现类可以实现多个接口
只能继承一个类
实现接口的类必须实现所有接口中的成员
非抽象派生类必须实现抽象方法
直接实现
需要override实现抽象方法
都不能实例化,且均包含未实现的方法,其派生类必须实现未实现的方法。
2、接口作为参数的意义和接口作为返回值的意义
接口作为参数时,我们只需要传递一个实现了接口的对象,只要此对象实现了该接口都可作为参数传递进去。
接口作为返回值时,实际上要返回的也是实现了接口的对象。
3、隐式实现接口和显示实现的操作(代码)
定义接口:
publicinterfaceIPerson
voidSayHi();
隐式实现:
publicvoidSayHi()
thrownewException("
Themethodoroperationisnotimplemented."
显示实现:
避免了接口成员之间因为同名而发生混淆。
不能通过类的实例进行访问,强制转换为接口调用。
void()
、什么是特性
特性:
即为目标元素(可以是数据集、模块、类、属性、方法、甚至函数参数等)加入附加信息,类似于注释。
其本质上也是一个类。
一般来说,特性命名都以Attribute结尾,使用时可以省略。
2、什么是序列化,写出序列化的基本过程(图9-3)
格式化程序
序列化:
将对象的状态存储到特定存储介质中的过程,也可以说是将对象状态转换为可保持或传输的格式的过程。
在序列化过程中,会将对象的公有成员,私有成员包括类名,都转换成数据流的形式,存储到存储介质中,即通常所说的文件。
对象是否可序列化
对象的成员是否
可序列化
格式化器将对象格式化为特定格式数据流
写入文件
结束
异常处理退出
Yes
No
3、序列化和反序列化的用途
当我们需要将对象的字段值保存在磁盘中时,不需要再去编写大量对象去写入,只需要将每个对象加一个可序列化标记[Serializable],就可实现。
在远程通信中应用非常广泛。
4、程序集和命名空间的区别
程序集就是一个编译好的.exe文件,是框架应用程序的生成块,它包含编译好的代码逻辑单元。
.dll也是一个程序集。
而命名空间namespace是相当于一个包,使用管理我们的代码。
5、程序集的结构
程序集由描述它的程序集清单(包含指定该程序集的版本要求和安全标识所需的所有元数据)、类型元数据、MSIL代码(实现类型元数据的中间代码)和资源组成。
6、Sealed修饰属性、方法、类的含义
Sealed修饰类时,表示该类不能再被继承,不能和abstract同时使用,因为它们在含义上互相排斥。
用于方法和属性时,表示该方法或属性不能再被重写,必须和override关键字一起使用,因为使用sealed修饰符的方法或属性肯定是基类中相应的虚成员。
通常用于实现第三方类库时不想被客户端继承,或用于没有必要再继承的类以防止滥用继承造成层次结构体系混乱
7、什么是反射,及功能
反射就是可以用ILDasm反编译工具浏览一个dll和exe的构成。
反射可以获取已加载的程序集和在其中定义的类型(如类、接口和值类型)的信息。
也可以利用反射在运行时创建类型实例以及调用和访问这些实例。
还可以查找程序集的信息。
8、使用反射实现加载程序集,并实例化该程序集中某一类型,并调用该类型中的某一方法(代码实现)
stringversion=(@“D:
\”).GetName().();
S2在.NET框架下开发三层结构
1、什么是三层结构,并解释各层次的主要功能(图1-7)
三层:
表示层、业务逻辑层(BLL)、数据访问层(DAL)。
表示层
业务逻辑层
数据访问层
为用户提供交互操作界面
负责关键业务的处理和数据传递
实现数据库访问
2、请写出三层数据传递方向(图1-12)
客户请求
响应数据
3、三层开发的优势
便于维护与后期开发,分工明确。
1、什么是DataView
就是DataTable的动态视图,并可以对动态生成的视图中的数据进行排序、筛选等操作。
2、使用三层开发用户登陆(画类图)
3、使用代码实现DataSet结构(32页)
两种方式:
1)通过指定DataSet中具体的DataTable的某行某列来获取数据:
通过表名(从DataSet中获取指定的DataTable)、通过索引(从DataTable中获取指定的DataRow)、通过列名(从DataRow中获取指定列的数据)。
2)将DataSet中的数据直接绑定到数据展示控件上
1、实体类在三层结构中的应用(图)
三层结构之间数据传递的载体,可以消除关系数据与类之间的差别,以便更好地使用面向对象思想来实现系统。
2、Using关键字在c#中的用法
有两种用法:
1)作为指令,引入命名空间;
2)作为语句,允许用户定义一个范围,并在此范围末尾自动释放对象。
1、为什么需要异常处理
处理程序运行时发生的错误。
当异常发生时,系统要能够自动处理,避免系统终止运行,防止出现故障而导致的系统崩溃。
2、如何进行异常处理
Try…catch…finally
注意:
不要用太多的异常处理,同时要尽量避免使用嵌套异常处理,因为异常处理使用不合理会使系统的性能下降。
3、什么是单元测试
软件开发中的单元测试是对整个项目中的某一个模块及模块中的某一个类、或某类中的某一个方法的测试。
4、为什么需要单元测试
单元测试要确保编写的代码语法和语义都正确,确保软件质量的具体操作方法。
5、如何使用VSTS写单元测试(步骤)
创建测试、编写测试、运行测试。
6、Exception类的常用属性(MESSAGE,SOURCE)的含义
Message:
提供引用异常的详细信息
Source:
导致异常发生的应用程序或对象的名称。
7、简述throw关键字在异常处理中的使用过程
throw表示手动抛出一个异常。
thrownewException(“我抛出的异常!
”);
1、什么是设计模式
设计模式描述了软件开发过程中某一类常见问题的一般性解决方案。
而面