题目来源于传智播客和各大互联网,复习、从新整理贴出来。javascript
一、简述 private、 protected、 public、 internal、protected internal 访问修饰符和访问权限java
private : 私有成员, 在类的内部才能够访问。ios
protected : 保护成员,该类内部和继承类中能够访问。c++
public : 公共成员,彻底公开,没有访问限制。程序员
internal: 当前程序集内能够访问。数据库
protected internal: 访问仅限于当前程序集或从包含类派生的类型。编程
不带修饰符的类是默认internal。c#
二、简述abstract、sealed类修饰符数组
abstract:能够被指示一个类只能做为其它类的基类。浏览器
sealed:指示一个类不能被继承。
三、简述C#成员修饰符
abstract:指示该方法或属性没有实现。
const:指定域或局部变量的值不能被改动。
event:声明一个事件。
extern:指示方法在外部实现。
override:对由基类继承成员的新实现。
readonly:指示一个域只能在声明时以及相同类的内部被赋值。
static:指示一个成员属于类型自己,而不是属于特定的对象。
virtual:指示一个方法或存取器的实现能够在继承类中被覆盖。
四、ADO.NET中的五个主要对象
Connection:主要是开启程序和数据库之间的链接。没有利用链接对象将数据库打开,是没法从数据库中取得数据的。Close和Dispose的区别,Close之后还能够Open,Dispose之后则不能再用。
Command:主要能够用来对数据库发出一些指令,例如能够对数据库下达查询、新增、修改、删除数据等指令,以及调用存在数据库中的存储过程等。这个对象是架构在Connection 对象上,也就是Command: 对象是经过在Connection对象链接到数据源。
DataAdapter:主要是在数据源以及DataSet 之间执行数据传输的工做,它能够透过Command 对象下达命令后,并将取得的数据放入DataSet 对象中。这个对象是架构在Command对象上,并提供了许多配合DataSet 使用的功能。
DataSet:这个对象能够视为一个暂存区(Cache),能够把从数据库中所查询到的数据保留起来,甚至能够将整个数据库显示出来,DataSet是放在内存中的。DataSet 的能力不仅是能够储存多个Table 而已,还能够透过DataAdapter对象取得一些例如主键等的数据表结构,并能够记录数据表间的关联。DataSet 对象能够说是ADO.NET 中重量级的对象,这个对象架构在DataAdapter对象上,自己不具有和数据源沟通的能力;也就是说咱们是将DataAdapter对象当作DataSet 对象以及数据源间传输数据的桥梁。DataSet包含若干DataTable、DataTableTable包含若干DataRow。
DataReader:当咱们只须要循序的读取数据而不须要其它操做时,可使用DataReader 对象。DataReader对象只是一次一次向下循序的读取数据源中的数据,这些数据是存在数据库服务器中的,而不是一次性加载到程序的内存中的,只能(经过游标)读取当前行的数据,并且这些数据是只读的,并不容许做其它的操做。由于DataReader 在读取数据的时候限制了每次只读取一条,并且只能只读,因此使用起来不但节省资源并且效率很好。使用DataReader 对象除了效率较好以外,由于不用把数据所有传回,故能够下降网络的负载。
ADO.NET 使用Connection 对象来链接数据库,使用Command 或DataAdapter对象来执行SQL语句,并将执行的结果返回给DataReader 或 DataAdapter ,而后再使用取得的DataReader 或DataAdapter 对象操做数据结果。
五、列举ASP.NET 页面之间传递值的几种方式和优缺点
1.使用QueryString, 如....?id=1; response. Redirect(): 传递的参数会显示在url中,不安全而且不能传递数组或对象。
2.使用Session变量:简单,但易丢失 做用于用户我的,过量的存储会致使服务器内存资源的耗尽。
3.使用Server.Transfer:流程从当前页面引导到另外一个页面中,新的页面使用前一个页面的应答流,数据库稳定,安全,但性能相对弱。
4.Cookie传值:简单,但可能不支持,可能被伪造 Cookie是存放在客户端的,而session是存放在服务器端的。并且Cookie的使用要配合ASP.NET内置对象Request来使用
5.Application传值:对象的做用范围是整个全局,也就是说对全部用户都有效。其经常使用的方法用Lock和UnLock
6.PreviosPage:这个通常比较少用。
Server.Transfer和Response.Redirect的区别:Server.Transfer是服务器内部的转接,浏览器不知道;Response.Redirect是有浏览器参与的,因此在地址栏中能够看到地址的变化。
六、C#中的委托是什么?事件是否是一种委托?事件和委托的关系
委托能够把一个方法做为参数代入另外一个方法。
委托能够理解为指向一个函数的指针。
委托和事件没有可比性,由于委托是类型,事件是对象,下面说的是委托的对象(用委托方式实现的事件)和(标准的event方式实现)事件的区别。事件的内部是用委托实现的。由于对于事件来说,外部只能“注册本身+=、注销本身-=”,外界不能够注销其余的注册者,外界不能够主动触发事件,所以若是用Delegate就无法进行上面的控制,所以诞生了事件这种语法。事件是用来阉割委托实例的,类比用一个自定义类阉割List。事件只能add、remove本身,不能赋值。事件只能+=、-=,不能= 。加分的补充回答:事件内部就是一个private的委托和add、remove两个方法。
七、重写(override)与重载(overload)的区别
override 是进行基类中函数的重写。override是面向对象的概念。override 方法提供从基类继承的成员的新实现。经过 override 声明重写的方法称为重写基方法。重写的基方法必须与 override 方法具备相同的签名
重载是方法的名称相同。参数个数或参数类型不一样,进行屡次重载以适应不一样的须要。重载(overload)是面向过程的概念。
八、C#中索引器是否只能根据数字进行索引?是否容许多个索引器参数?
参数的个数和类型都是任意的。用reflector反编译能够看出,索引器的内部本质上就是set_item、get_item方法。
九、属性和public字段的区别是什么?调用set方法为一个属性设值,而后用get方法读取出来的值必定是set进去的值吗?
属性能够对设值、取值的过程进行非法值控制,好比年龄禁止设值负数,而字段则不能进行这样的设置。虽然通常状况下get读取的值就是set设置的值,可是可让get读取的值不是set设置的值的,极端的例子。Public Age{get{return 100;}set{}}。用reflector反编译能够看出,属性内部本质上就是set_***、get_***方法。
十、三层架构
一般意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。
区分层次的目的即为了“高内聚,低耦合”的思想。
表现层(UI):通俗讲就是展示给用户的界面,即用户在使用一个系统的时候的所见所得。
业务逻辑层(BLL):针对具体问题的操做,也能够说是对数据层的操做,对数据业务逻辑处理。
数据访问层(DAL):该层所作事务直接操做数据库,针对数据的增添、删除、修改、更新、查找等每层之间是一种垂直的关系。
三层结构是N层结构的一种,通常来讲,层次之间是向下依赖的,下层代码未肯定其接口(契约)前,上层代码是没法开发的,下层代码接口(契约)的变化将使上层的代码一块儿变化。
优势: 分工明确,条理清晰,易于调试,并且具备可扩展性。
缺点: 增长成本。
十一、MVC模式
MVC(Model View Controller)模型-视图-控制器
aspx就是View,视图;Model:DataSet、Reader、对象;Controller:cs代码。
MVC是典型的平行关系,没有说谁在上谁在下的关系,模型负责业务领域的事情,视图负责显示的事情,控制器把数据读取出来填充模型后把模型交给视图去处理。而各类验证什么的应该是在模型里处理了。它强制性的使应用程序的输入、处理和输出分开。MVC最大的好处是将逻辑和页面分离。
十二、什么是装箱(boxing)和拆箱(unboxing)?
装箱:从值类型转换到引用类型。
拆箱:从引用类型转换到值类型。
object obj = null;//引用类型
obj = 1;//装箱,boxing。把值类型包装为引用类型。
int i1 = (int)obj;//拆箱。unboxing
1三、什么叫应用程序域(AppDomain)
一种边界,它由公共语言运行库围绕同一应用程序范围内建立的对象创建(即,从应用程序入口点开始,沿着对象激活的序列的任何位置)。
应用程序域有助于将在一个应用程序中建立的对象与在其余应用程序中建立的对象隔离,以使运行时行为能够预知。
在一个单独的进程中能够存在多个应用程序域。应用程序域能够理解为一种轻量级进程。起到安全的做用。占用资源小。
1四、CTS、CLS、CLR分别做何解释
CTS:Common Type System 通用系统类型。Int3二、Int16→int、String→string、Boolean→bool
CLS:Common Language Specification 通用语言规范。不一样语言语法的不一样。
CLR:Common Language Runtime 公共语言运行时,就是.Net提供的那些类
1五、在dotnet中类(class)与结构(struct)的异同?
Class能够被实例化,属于引用类型,是分配在内存的堆上的。类是引用传递的。
Struct属于值类型,是分配在内存的栈上的。结构体是复制传递的。
1六、堆和栈的区别?
栈是编译期间就分配好的内存空间,所以你的代码中必须栈的大小有明确的定义;局部值类型变量、值类型参数等都在栈内存中。
堆是程序运行期间动态分配的内存空间,你能够根据程序的运行状况肯定要分配的堆内存的大小。
1七、能用foreach遍历访问的对象的要求
须要实现IEnumerable接口或声明GetEnumerator方法的类型。
1八、GC是什么? 为何要有GC?
GC是垃圾收集器。程序员不用担忧内存管理,由于垃圾收集器会自动进行管理。GC只能处理托管内存资源的释放,对于非托管资源则不能使用GC进行回收,必须由程序员手工回收,一个例子就是FileStream或者SqlConnection须要程序员调用Dispose进行资源的回收。
要请求垃圾收集,能够调用下面的方法:GC.Collection()通常不须要手动调用GC.Collection()。
1九、String s = new String("xyz");建立了几个String Object?
两个对象,一个是“xyz”,一个是指向“xyz”的引用对象。
20、值类型和引用类型的区别?
1.将一个值类型变量赋给另外一个值类型变量时,将复制包含的值。引用类型变量的赋值只复制对对象的引用,而不复制对象自己。
2.值类型不可能派生出新的类型:全部的值类型均隐式派生自 System.ValueType。但与引用类型相同的是,结构也能够实现接口。
3.值类型不可能包含 null 值:然而,可空类型功能容许将 null 赋给值类型。
4.每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。
2一、C#中的接口和类有什么异同。
不一样点:
不能直接实例化接口。
接口不包含方法的实现。
接口能够多继承,类只能单继承。
类定义可在不一样的源文件之间进行拆分。
相同点:
接口、类和结构均可以从多个接口继承。
接口相似于抽象基类:继承接口的任何非抽象类型都必须实现接口的全部成员。
接口和类均可以包含事件、索引器、方法和属性。
2二、abstract class和interface有什么区别?
相同点:
都不能被直接实例化,均可以经过继承实现其抽象方法。
不一样点:
接口支持多继承;抽象类不能实现多继承。
接口只能定义行为;抽象类既能够定义行为,还可能提供实现。
接口能够用于支持回调(CallBack);抽象类不能实现回调,由于继承不支持。
接口只包含方法(Method)、属性(Property)、索引器(Index)、事件(Event)的签名,但不能定义字段和包含实现的方法;
抽象类能够定义字段、属性、包含有实现的方法。
接口能够做用于值类型(Struct)和引用类型(Class);抽象类只能做用于引用类型。例如,Struct就能够继承接口,而不能继承类。
2三、是否能够继承String类?
String类是sealed类故不能够继承。
2四、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,何时被执行?
会执行,在return前执行。
若是C#设计的是先执行cmd.Dispose()再执行return就会出现return执行失败了,由于cmd已经Dispose了。
2五、new 关键字用法
new 运算符 用于建立对象和调用构造函数。
new 修饰符 用于向基类成员隐藏继承成员。
new 约束 用于在泛型声明中约束可能用做类型参数的参数的类型。
2六、如何把一个Array复制到ArrayList里
实现1 string[] s ={ "111", "22222" }; ArrayList list = new ArrayList(); list.AddRange(s);
实现2 string[] s ={ "111", "22222" }; ArrayList list = new ArrayList(s);
2七、描述线程与进程的区别?
1.线程(Thread)与进程(Process)两者都定义了某种边界,不一样的是进程定义的是应用程序与应用程序之间的边界,不一样的进程之间不能共享代码和数据空间,而线程定义的是代码执行堆栈和执行上下文的边界。
2.一个进程能够包括若干个线程,同时建立多个线程来完成某项任务,即是多线程。而同一进程中的不一样线程共享代码和数据空间。用一个比喻来讲,若是一个家庭表明一个进程,在家庭内部,各个成员就是线程,家庭中的每一个成员都有义务对家庭的财富进行积累,同时也有权利对家庭财富进行消费,当面对一个任务的时候,家庭也能够派出几个成员来协同完成,而家庭以外的人则没有办法直接消费不属于本身家庭的财产。
2八、什么是强类型,什么是弱类型?哪一种更好些?为何?
C#中
int i=3;
i="a";
不能够
JavaScript中
var i=3;
i="a";
能够
强类型是在编译的时候就肯定类型的数据,在执行时类型不能更改,而弱类型在执行的时候才会肯定类型。
没有好很差,两者各有好处,强类型安全,由于它事先已经肯定好了,并且效率高。弱类型更灵活,可是效率低,并且出错几率高
通常用于编译型编程语言,如c++,java,c#,pascal等,弱类型相比而言不安全,在运行的时候容易出现错误,但它灵活,多用于解释型编程语言,如javascript,vb等
2九、什么是反射?
程序集包含模块,而模块又包括类型,类型下有成员,反射就是管理程序集,模块,类型的对象,它可以动态的建立类型的实例,设置现有对象的类型或者获取现有对象的类型,能调用类型的方法和访问类型的字段属性。它是在运行时建立和使用类型实例。
30、int、DateTime、string是否能够为null?
int、DateTime不能,由于其为Struct类型,而结构属于值类型,值类型不能为null,只有引用类型才能被赋值null。string能够为null。