.NET面试题集
1. new 关键字用法
(1)new 运算符
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
用于创建对象和调用构造函数。 第一种:new Class();
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
(2)new 修饰符
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
用于向基类成员隐藏继承成员。 第二种:覆盖方法public new XXXX()
{}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
(3)new 约束
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
用于在泛型声明中约束可能用作类型参数的参数的类型。 第三种:new 约束指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2. 如何把一个 Array 复制到 ArrayList 里
(1) 实现 1
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
string[] s =
{ "111", "22222" };
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
ArrayList list = new ArrayList();
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
list.AddRange(s);
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
(2) 实现 2
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
string[] s =
{ "111", "22222" };
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
ArrayList list = new ArrayList(s);
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
(3) 实现 3
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
foreach( object o in array )arrayList.Add(o);
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3.DataGrid 的 Datasouse 可以连接什么数据源
l DataTable
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
l DataView
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
l DataSet
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
l DataViewManager
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
l 任何实现 IListSource 接口的组件
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
l 任何实现 IList 接口的组件
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
4. 概述反射和序列化
反射:程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性
序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。在另一端,反序列化将从该流重新构造对象。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
反射
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
公共语言运行库加载器管理应用程序域。这种管理包括将每个程序集加载到相应的应用程序域以及控制每个程序集中类型层次结构的内存布局。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
序列化
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
5. 概述 O/R Mapping 的原理
利用反射,配置将对象和数据库表映射。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
6. 可访问性级别有哪几种
private : 私有成员, 在类的内部才可以访问。
protected : 保护成员,该类内部和继承类(派生类)中可以访问
public : 公共成员,完全公开,没有访问限制。
internal: 在同一命名空间内可以访问。即仅限于当前程序集
protected internal 访问仅限于从包含类派生的当前程序集或类型。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
7. sealed 修饰符有什么特点
sealed 修饰符可以应用于类、实例方法和属性。
密封类不能被继承,sealed 修饰符用于防止从所修饰的类派生出其它类。如果一个密封类被指定为其他类的基类,则会发生编译时错误。
密封方法会重写基类中的方法,但其本身不能在任何派生类中进一步重写。当应用于方法或属性时, sealed 修饰符必须始终与 override 一起使用。
密封类不能同时为抽象类。
由于密封类永远不会有任何派生类,所以对密封类的实例的虚拟函数成员的调用可以转换为非虚拟调用来处理。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
8. 列举 ADO.NET 中的共享类和数据库特定类
共享类
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
DataSet \DataTable \DataRow \DataColumn \DataRelation \Constraint \DataColumnMapping \DataTableMapping
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
特定类
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
(x)Connection \(x)Command \(x)CommandBuilder \(x)DataAdapter \(x)DataReader \(x)Parameter \(x)Transaction
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
9. 执行下面代码后:
String strTemp ="abcdefg 某某某 " ;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
Int i=System.Text.Encoding.Default.GetBytes(strTemp).Length;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
Int j=strTemp.Length;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
问:
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
i=?
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
j=?
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
i=(14 ) ; j=(11 ) 中文两个字节
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
10.C# 中, string str = null 与 string str ="" ,请尽量用文字说明区别。
string str ="" 初始化对象分配空间 ,是值得拷贝,null是没有空间引用的
而 string str=null 初始化对象 ,是分配内存地址,是空间为0的字符串
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
11. 详述 .NET 里 class 和 struct 的异同
结构可以实现接口。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
有与类相同的成员类型。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
结构是值类型,而类是引用类型。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
向方法传递结构时,结构是通过传值方式传递的,而不是作为引用传递的。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
与类不同,结构的实例化可以不使用 new 运算符。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
结构可以声明构造函数,但它们必须带参数。 结构不能声明默认构造函数(没有参数的构造函数)或析构函数。结构的副本由编译器自动创建和销毁,因此不需要使用默认构造函数和析构函数。实际上,编译器通过为所有字段赋予默认值(参见默认值表)来实现默认构造函数。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
一个结构不能从另一个结构或类继承,而且不能作为一个类的基。所有结构都直接继承自 System.ValueType ,后者继承自 System.Object 。 C# 中的所有值类型本质上都继承自 ValueType ,后者继承自 Object 。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
结构的值存储在“在堆栈上”或“内联”。细心的程序员有时可以通过聪明地使用结构来增强性能。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
尽管结构的静态字段可以初始化,结构实例字段声明还是不能使用初始值设定项。 在结构中初始化实例字段是错误的。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
结构是值类型 -- 如果从结构创建一个对象并将该对象赋给某个变量,变量则包含结构的全部值。复制包含结构的变量时,将复制所有数据,对新副本所做的任何修改都不会改变旧副本的数据。由于结构不使用引用,因此结构没有标识 -- 具有相同数据的两个值类型实例是无法区分的。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
12. 什么叫应用程序域?什么是托管代码?什么是强类型系统?什么是装箱和拆箱?什么是重载? CTS 、 CLS 和 CLR 分别作何解释?
应用程序域
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
应用程序域为安全性、可靠性、版本控制以及卸载程序集提供了隔离边界。应用程序域通常由运行库宿主创建,运行库宿主负责在运行应用程序之前引导公共语言运行库。应用程序域提供了一个更安全、用途更广的处理单元,公共语言运行库可使用该单元提供应用程序之间的隔离。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
托管代码
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
使用基于公共语言运行库的语言编译器开发的代码称为托管代码;托管代码具有许多优点,例如:跨语言集成、跨语言异常处理、增强的安全性、版本控制和部署支持、简化的组件交互模型、调试和分析服务等。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
装箱和拆箱
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
装箱和拆箱使值类型能够被视为对象。对值类型装箱将把该值类型打包到 Object 引用类型的一个实例中。这使得值类型可以存储于垃圾回收堆中。拆箱将从对象中提取值类型。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
重载
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
每个类型成员都有一个唯一的签名。方法签名由方法名称和一个参数列表(方法的参数的顺序和类型)组成。只要签名不同,就可以在一种类型内定义具有相同名称的多种方法。当定义两种或多种具有相同名称的方法时,就称作重载。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
CTS 通用类型系统 (common type system)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
一种确定公共语言运行库如何定义、使用和管理类型的规范。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
CLR 公共语言运行库
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
.NET Framework 提供了一个称为公共语言运行库的运行时环境,它运行代码并提供使开发过程更轻松的服务。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
CLS 公共语言规范
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
要和其他对象完全交互,而不管这些对象是以何种语言实现的,对象必须只向调用方公开那些它们必须与之互用的所有语言的通用功能。为此定义了公共语言规范 (CLS) ,它是许多应用程序所需的一套基本语言功能。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
强类型
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
C# 是强类型语言;因此每个变量和对象都必须具有声明类型。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
13. 值类型和引用类型的区别?
基于值类型的变量直接包含值。将一个值类型变量赋给另一个值类型变量时,将复制包含的值。这与引用类型变量的赋值不同,引用类型变量的赋值只复制对对象的引用,而不复制对象本身。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
所有的值类型均隐式派生自 System.ValueType 。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
与引用类型不同,从值类型不可能派生出新的类型。但与引用类型相同的是,结构也可以实现接口。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
与引用类型不同,值类型不可能包含 null 值。然而,可空类型功能允许将 null 赋给值类型。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
值类型主要由两类组成:结构、枚举
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
结构分为以下几类: Numeric (数值)类型、整型、浮点型、 decimal 、 bool 、用户定义的结构。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
引用类型的变量又称为对象,可存储对实际数据的引用。声明引用类型的关键字: class 、 interface 、 delegate 、内置引用类型: object 、 string
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
14. 如何理解委托
委托类似于 C++ 函数指针,但它是类型安全的。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
委托允许将方法作为参数进行传递。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
委托可用于定义回调方法。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
委托可以链接在一起;例如,可以对一个事件调用多个方法。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
方法不需要与委托签名精确匹配。有关更多信息,请参见协变和逆变。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
C# 2.0 版引入了匿名方法的概念,此类方法允许将代码块作为参数传递,以代替单独定义的方法。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
15.C# 中的接口和类有什么异同。
异:
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
不能直接实例化接口。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
接口不包含方法的实现。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
接口、类和结构可从多个接口继承。但是 C# 只支持单继承:类只能从一个基类继承实现。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
类定义可在不同的源文件之间进行拆分。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
同:
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
接口、类和结构可从多个接口继承。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
接口可以包含事件、索引器、方法和属性。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
一个类可以实现多个接口。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
具体的说,接口是负责功能的定义,项目中通过接口来规范类,操作类以及抽象类的概念! 而类是负责功能的具体实现!
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
在类中也有抽象类的定义,抽象类与接口的区别在于:
抽象类是一个不完全的类,类里面有抽象的方法,属性,也可以有具体的方法和属性,需要进一步的专业化。
但接口是一个行为的规范,里面的所有东西都是抽象的!
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
16.ASP.net 的身份验证方式有哪些
Windows 身份验证提供程序
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
提供有关如何将 Windows 身份验证与 Microsoft Internet 信息服务 (IIS) 身份验证结合使用来确保 ASP.NET 应用程序安全的信息。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
Forms 身份验证提供程序
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
提供有关如何使用您自己的代码创建应用程序特定的登录窗体并执行身份验证的信息。使用 Forms 身份验证的一种简便方法是使用 ASP.NET 成员资格和 ASP.NET 登录控件,它们一起提供了一种只需少量或无需代码就可以收集、验证和管理用户凭据的方法。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
Passport 身份验证提供程序
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
提供有关由 Microsoft 提供的集中身份验证服务的信息,该服务为成员站点提供单一登录和核心配置
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
17. 活动目录的作用
Active Directory 存储了有关网络对象的信息,并且让管理员和用户能够轻松地查找和使用这些信息。 Active Directory 使用了一种结构化的数据存储方式,并以此作为基础对目录信息进行合乎逻辑的分层组织。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
18. 解释一下 UDDI 、 WSDL 的意义及其作用
Web Service便是基于网络的、分布式的模块化组件,它执行特定的任务,遵守具体的技术规范,这些规范使得Web Service能与其他兼容的组件进行互操作。
UDDI 的目的是为电子商务建立标准;UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,以使别的企业能够发现的访问协议的实现标准。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
UDDI
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
统一描述、发现和集成协议 (UDDI, Universal Description, Discovery and Integration) 是一套基于 Web 的、分布式的、为 Web 服务提供的信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的 Web 服务注册以使得别的企业能够发现的访问协议的实现标准。 UDDI 提供了一组基于标准的规范用于描述和发现服务,还提供了一组基于因特网的实现。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
WSDL
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
WSDL 描述 Web 服务的公共接口。这是一个基于 XML 的关于如何与 Web 服务通讯和使用的服务描述;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
l 服务 URL 和命名空间
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
l 网络服务的类型(可能还包括 SOAP 的函数调用,正像我所说过的, WSDL 足够自如地去描述网络服务的广泛内容)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
l 有效函数列表
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
l 每个函数的参数
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
l 每个参数的类型
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
l 每个函数的返回值及其数据类型
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
20. 如何部署一个 ASP.net 页面
VS 2005 和 VS 2003 都有发布机制。 2003 可以发布然后再复制部署。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
VS2005 基本上可以直接部署到对应位置。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
21. 如何理解 .net 中的垃圾回收机制
垃圾回收器是用来管理应用程序的内存分配和释放的。当一个应用程序在运行的时候,垃圾回收器设置了一个托管堆。每次当开发人员使用 new 运算符创建对象时,运行库都从托管堆为该对象分配内存。新创建的对象被放在上次创建的对象之后。垃圾回收器保存了一个指针,该指针总是指向托管堆中最后一个对象之后的内存空间。当新的对象被产生时,运行库就知道应该将新的对象放在内存的什么地方。当垃圾回收器的指针指向托管堆以外的内存空间时,就需要回收内存中的垃圾了。在这个过程中,垃圾回收器首先假设在托管堆中所有的对象都需要被回收。然后它在托管堆中寻找被根对象引用的对象(根对象就是全局,静态或处于活动中的局部变量以及寄存器指向的对象),找到后将它们加入一个有效对象的列表中,并在已经搜索过的对象中寻找是否有对象被新加入的有效对象引用。直到垃圾回收器检查完所有的对象后,就有一份根对象和根对象直接或间接引用了的对象的列表,而其它没有在表中的对象就被从内存中回收。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)