
1、.NET框架包括两个部分,分别是(框架类库FCL)和(公共语言运行时CLR)。
2、.NET语言编译器产生的代码叫(中间代码)。
3、实时(JIT)编译器负责将方法的(中间代码)编译为本机代码。
4、.NET源代码执行前要经过两次编译,分别是(语言编译器将源代码编译成中间代码)和(JIT编译器将中间代码编译成机器代码)。
5、CLR默认的所有类型最终都继承自(System.Object)。
6、编译器直接支持的任何数据类型都称为(基元类型)。
7、CLR中的所有类型可被分为(值类型)和(引用类型)两种类型。
8、结构(用struct关键字定义)是(值)类型。
9、数组是(引用)类型。
10、事件成员使用C#关键字(event)定义。
11、在C#中,可以使用(StringBuilder)类型高效地构造和操作字符串。
12、所有枚举类型都直接从(System.Enum)类型派生。
13、所有数组类型都隐式从(Array)类型派生。
14、在C#中,使用关键字(interface)来声明接口。
15、C#中用于声明委托的关键字是(delegate)。
16、在C#中用(+=)操作符和(-=)操作符在委托链表上添加和移除委托实例。
17、(泛型)是CLR提供的一种特殊机制,可以实现算法的通用性。
18、允许同步或异步地读取数据流和文件的命名空间是(System.IO)。
19、流的三种基本操作是(读)、(写)和(查找)。
20、在C#中要标记一个类型是可序列化的,可以使用(Serializable)特性。
21、特性(attribute)的参数可以是(定位参数)或(命名参数)。
22、列举ADO.net中的五个主要对象(Connection)、(Command)、(DataReader)、(DataAdapter)、(DataSet)。
二、
判断
1、.NET中,程序集是最小的重用、安全性及版本控制单元。(对)
2、命令csc /out:App.exe App.cs和命令csc App.cs是等效的。(对)
3、从属于一个命名空间的各个类型可以在不同的程序集中实现。(对)
4、在一个程序集中也可能包括不同的命名空间。(对)
5、CLR允许我们将对象转换为其原来的类型或者它的任何一个基类型。( 对 )
6、用关键字class声明的类型不一定是引用类型。(错)
7、C#中常数用const声明,总是静态的。(对)
8、类的实例在访问从其基类继承的任何字段之前,必须调用基类的构造函数。(对)
9、C#允许我们为一个值类型定义没有任何参数的构造函数。(错)
10、CLR支持含参属性(property),在C#中称它们是索引器。(对)
11、CLR默认所有的方法的参数按值传递。(对)
12、只有方法的最后一个参数才可以标记关键字params。(对)
13、当值类型必须转换为引用类型时,就发生装箱。(对)
14、在.NET框架中,字符采用16位Unicode编码。(对)
15、在C#中,可以采用new操作符在一个直接量字符串基础上创建String对象。(错)
16、枚举是值类型。(对)
17、枚举类型中不能定义方法、属性和事件。(对)
18、我们可以在一个枚举类型上应用System.FlagsAttribute特性,使之可以标识位标记。(对)
19、在.NET中,可以创建下届非0的数组。(对)
20、CLR支持多类继承和多接口继承。(错)
21、一个接口可以继承自其他接口。(对)
22、当一个类型继承某个接口时,它不仅要实现该接口定义的所有方法,还要实现该接口从其他接口中继承而来的所有方法。(对)
23、只能通过接口类型的变量调用显式接口方法。(对)
24、定义和使用泛型时,需要为类型指定一个类型参数。(对)
25、在C#中,int?和int是同一个类型。(错)
26、Lambda表达式提供了一种机制,可以用更简单的方式来写匿名方法。(对)
27、扩展方法可以向不能有子类的密封类和结构添加新功能。(对)
28、扩展方法只能定义在静态类中,第一个参数必须用this限定符。(对)
29、异常类对象均为System.Exception类的对象。(对)
30、通过var关键字声明的隐式类型变量是弱类型数据。(错)。
四、简答题
1、简述值类型和引用类型的区别。
| 值类型 | 引用类型 | |
| 内存分配地点 | 分配在栈中 | 分配在堆中 |
| 效率 | 效率高,不需要地址转换 | 效率低,需要进行地址转换 |
| 内存回收 | 使用完后,立即回收 | 使用完后,不是立即回收,等待GC回收 |
| 赋值操作 | 进行复制,创建一个同值新对象 | 只是对原有对象的引用 |
| 函数参数与返回值 | 是对象的复制 | 是原有对象的引用,并不产生新的对象 |
| 类型扩展 | 不易扩展 | 容易扩展,方便与类型扩展 |
委托类似于 C++ 函数指针,但它是类型安全的。委托允许将方法作为参数进行传递。委托可用于定义回调方法。委托可以链接在一起;例如,可以对一个事件调用多个方法。方法不需要与委托签名精确匹配。C# 2.0 版引入了匿名方法的概念,此类方法允许将代码块作为参数传递,以代替单独定义的方法。C#3.0版引入了Lambda表达式,以简化委托的使用。
3、abstract class和interface有什么区别?
(1)声明方法的存在而不去实现它的类被叫做抽象类(abstract class),接口(interface)是抽象类的变体。
(2)抽象类可以有实现(包括构造函数),而接口不可以有任何实现。
(3)抽象类中还以有成员变量(包含静态成员变量)、属性、常量和静态方法,并且他们可以是非公共的;而接口中不能有成员变量、常量、静态方法,只能有公共的属性。
(4)抽象类可以从另一个类或者一个/多个接口派生;而接口不能从另一个类派生却可以实现另一个或多个接口。
(5)一个.net类只能从一个基类中派生即使这个基类是抽象类;然而一个.net类可以实现多个接口。(但是如果从一个抽象类派生或者从一个/多个接口实现,则必须实现抽象类或接口中所有的方法)
4、采用类还是结构,说说你的理由。
(1) 堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些。
(2) 结构表示如点、矩形和颜色这样的轻量对象。 例如,如果声明一个含有 1000 个Point对象的数组,则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低。
(3) 在表现抽象和多级别的对象层次时,类是最好的选择。
(4) 大多数情况下该类型只是一些数据时,结构时最佳的选择。
5、简述什么是装箱和拆箱?
从值类型接口转换到引用类型:装箱。从引用类型转换到值类型:拆箱。装箱和拆箱使值类型能够被视为对象。对值类型装箱将把该值类型打包到 Object 引用类型的一个实例中。这使得值类型可以存储于垃圾回收堆中。拆箱将从对象中提取值类型。
6、简述反射和序列化
反射:程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。
序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。在另一端,反序列化将从该流重新构造对象。
7、简述程序集和命名空间
一个命名空间和一个程序集并不一定是相关的。具体说来,从属于一个命名空间的各个类型可能在不同的程序集中实现。例如,system.IO.FileStream类型是在MSCorlib.dll 程序集中实现的,而System.IO.FileSystemWatcher类型是在System.dll 程序集中实现的。事实上, .net framework 甚至根本没有发布一个System.IO.dll程序集。
在一个程序集中,也可能包含不同命名空间中的类型。例如,System.Int32和System.Text.StringBuilder类型都在MSCorLib.dll程序集中。
在.net framework SDK文档中查找一个类型时,文档会明确的指出类型所属的命名空间,以及实现了该类型的程序集。
