.net面试问答(大汇总),.net求职者不容错过

作者:袖梨 2022-06-25

这是我整理出来的.net面试问答,希望对.net求职者有帮助,特别是对刚毕业的应届生。

用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层?

从下至上分别为:数据访问层、业务逻辑层(又或成为领域层)、表示层    
数据访问层:有时候也称为是持久层,其功能主要是负责数据库的访问     
业务逻辑层:是整个系统的核心,它与这个系统的业务(领域)有关     
表示层:是系统的UI部分,负责使用者与整个系统的交互。
优点:  分工明确,条理清晰,易于调试,而且具有可扩展性。     
缺点:  增加成本。

分层式结构究竟其优势何在?
1、开发人员可以只关注整个结构中的其中某一层;    
2、可以很容易的用新的实现来替换原有层次的实现;     
3、可以降低层与层之间的依赖;     
4、有利于标准化;     
5、利于各层逻辑的复用。     
概括来说,分层式设计可以达至如下目的:分散关注、松散耦合、逻辑复用、标准定义。

分层式结构也不可避免具有一些缺陷:
1、降低了系统的性能。这是不言而喻的。如果不采用分层式结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成。    
2、有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码。

MVC模式
MVC(Model-View-Controller)把交互系统的组成分解成模型、视图、控制器三种部件

mvc的优点:

1.通过把项目分成model view和controller,使得复杂项目更加容易维护。
2.没有使用view state和服务器表单控件,可以更方便的控制应用程序的行为
3.应用程序通过controller来控制程序请求,可以提供丰富的url重写。
4.对单元测试的支持更加出色
5.在团队开发模式下表现更出众

MVC的不足:

(1)增加了系统结构和实现的复杂性。对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。  
(2)视图与控制器间的过于紧密的连接。视图与控制器是相互分离,但确实联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。  
(3)视图对模型数据的低效率访问。依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。

asp.net如何实现MVC模式,举例说明!
web/business/dataaccess
列举ASP.NET 页面之间传递值的几种方式。
1.使用QueryString, 如....?id=1; response. Redirect()....    
2.使用Session变量     
3.使用Server.Transfer

请说明在.net中常用的几种页面间传递参数的方法,并说出他们的优缺点。
QueryString  传递一个或多个安全性要求不高或是结构简单的数值。但是对于传递数组或对象的话,就不能用这个方法了session(viewstate) 简单,但易丢失 作用于用户个人,过量的存储会导致服务器内存资源的耗尽。application 对象的作用范围是整个全局,也就是说对所有用户都有效。其常用的方法用Lock和UnLock  cookie简单,但可能不支持,可能被伪造 Cookie是存放在客户端的,而session是存放在服务器端的。而且Cookie的使用要配合ASP.NET内置对象Request来使用 input ttype="hidden" 简单,可能被伪造url参数简单,显示于地址栏,长度有限Server.Transfer  把流程从当前页面引导到另一个页面中新的页面使用前一个页面的应答流数据库稳定,安全,但性能相对弱

什么是Viewstate?它有什么作用?
ViewState用来保存页面状态,就是说提交之后我们还可以看到文本框里面的内容就是ViewState保存的功劳。    
ViewState只维护当前页面的状态,不同页面之间不能共享,Session可以。     
ViewState你可以理解为一个隐藏控件。

ASP.Net页面生命周期
每个页面的生命周期为用户的每一次访问,也就是说每一次客户端与服务器之间的一个往返过程.全局变量的生命周期在此之间.
1. Page_Init();    
2. Load ViewState and Postback data;     
3. Page_Load();     
4. Handle control events;     
5. Page_PreRender();     
6. Page_Render();     
7. Unload event;     
8. Dispose method called;

ADO.net中常用的对象有哪些?分别描述一下。
Connection        打开数据库连接    
Command            执行数据库命令     
DataAdapter        连接数据,执行数据库命令,填充DataSet     
DataSet            数据在内存中的缓存,数据结构     
DataReader        只读向前的读取数据库

DataReader和DataSet的异同
DataReader使用时始终占用SqlConnection,在线操作数据库..任何对SqlConnection的操作都会引发DataReader的异常..因为DataReader每次只在内存中加载一条数据,所以占用的内存是很小的..因为DataReader的特殊性和高性能.所以DataReader是只进的..你读了第一条后就不能再去读取第一条了..    
DataSet则是将数据一次性加载在内存中.抛弃数据库连接..读取完毕即放弃数据库连接..因为DataSet将数据全部加载在内存中.所以比较消耗内存...但是确比DataReader要灵活..可以动态的添加行,列,数据.对数据库进行回传更新操作...


存储过程和sql语句的优缺点
优点:
1.提高性能,减少网络传输,节约时间 。
2.减少网络流量    存储过程位于服务器上,调用的时候只须传递存储过程的名称以及参数,不用每次访问都传递很长的sql 语句。
4.安全性     减少sql 注入式攻击。
5.可维护性高    更新存储过程通常比更改、测试以及重新部署程序集需要较少的时间和精力。
缺点:
1.交互性差 。
2.可移植性差

说出你所了解的数据库访问组件(例如ADO,至少4种)
ADO,ADO.Net,MDAC(Microsoft Data Access Components),Microsoft SQL Server OLE DB Provider,
Microsoft Jet OLE DB Provider,Desktop Database Drivers ODBC Driver,Visual FoxPro ODBC Driver    

什么是面向对象
万物都是对象,其主要特征:封装、继承、多态    

怎样实现多态
1.通过对象直接调用成员函数时,始终默认使用该对象的类的成员函数(除非用::显示指定类名)。
2.通过指向对象的指针或引用调用成员函数时:如果该函数是实函数,则调用该指针或引用的类的成员函数;如果该函数是虚函数,则调用该指针或引用指向的对象的类的成员函数。    

面向对象的思想主要包括什么?
任何事物都可以理解为对象,其主要特征: 继承。封装。多态。特点:代码好维护,安全,隐藏信息

什么是装箱和拆箱?
从值类型接口转换到引用类型装箱。从引用类型转换到值类型拆箱。装箱(boxing)是将值类型的数据转化成引用类型,int i=3; object o = i ;便是装箱过程,而拆箱(unboxing)是将饮用类型数据转换值类型,比如int j = (int)o;属于拆箱


什么是Interface?它与Abstract Class有什么区别?
接口(Interface)是用来定义行为规范的,不会有具体实现,而抽象类除定义行为规范外,可以有部分实现,但一个类能实现多个接口,但只能继承一个父类

什么时候使用抽象类,什么时候用接口
接口用于规范,抽象类用于共性。接口中只能声明方法,属性,事件,索引器。而抽象类中可以有方法的实现,也可以定义非静态的类变量。抽象类是类,所以只能被单继承,但是接口却可以一次实现多个。抽象类可以提供某些方法的部分实现,接口不可以.抽象类的实例是它的子类给出的。接口的实例是实现接口的类给出的。再抽象类中加入一个方法,那么它的子类就同时有了这个方法。而在接口中加入新的方法,那么实现它的类就要重新编写(这就是为什么说接口是一个类的规范了)。接口成员被定义为公共的,但抽象类的成员也可以是私有的、受保护的、内部的或受保护的内部成员(其中受保护的内部成员只能在应用程序的代码或派生类中访问)。此外接口不能包含字段、构造函数、析构函数、静态成员或常量。    

什么是抽象类(abstract class)?
一种不可以被实例化的类。抽象类中一般含有抽象方法,当然也可有具体实现。继承类只有实现过所有抽象类的抽象方法后才能被实例化。

何时必须声明一个类为抽象类?
当这个类中包含抽象方法时,或是该类并没有完全实现父类的抽象方法时。

接口(interface)是什么?
只含有共有抽象方法(public abstract method)的类。这些方法必须在子类中被实现。

为什么不能指定接口中方法的修饰符?
接口中的方法用来定义对象之间通信的契约,指定接口中的方法为私有或保护没有意义。他们默认为公有方法。

可以继承多个接口么?
当然。

那么如果这些接口中有重复的方法名称呢?
这种情况中你可以决定如何实现。当然需要特别得小心。但是在编译环节是没有问题的。

接口和抽象类的区别是什么?
接口中所有方法必须是抽象的,并且不能指定方法的访问修饰符。抽象类中可以有方法的实现,也可以指定方法的访问修饰符。

详述.NET里class和struct的异同!
类是引用类型,可以继承类、接口和被继承,有默认的构造函数,有析构函数,可以使用abstract和sealed,有protected修饰符,必须使用new初始化。   
结构是值类型,只能继承接口,不能被继承,没有默认的构造函数,可以创建,没有析构函数,不可以用abstract和sealed,没有protected修饰符,可以不用new初始化。    

如何选择结构还是类
1. 堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些     
2. 结构表示如点、矩形和颜色这样的轻量对象     
例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。     
在此情况下,结构的成本较低。     
3. 在表现抽象和多级别的对象层次时,类是最好的选择     
4. 大多数情况下该类型只是一些数据时,结构时最佳的选择     

C#中的接口和类有什么异同。
异:
不能直接实例化接口。     
接口不包含方法的实现。     
接口、类和结构可从多个接口继承。但是C# 只支持单继承:类只能从一个基类继承实现。     
类定义可在不同的源文件之间进行拆分。     
同:
接口、类和结构可从多个接口继承。     
接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员。     
接口可以包含事件、索引器、方法和属性。     
一个类可以实现多个接口。

const和readonly有什么区别?
const关键字用来声明编译时常量,readonly用来声明运行时常量。

用sealed修饰的类有什么特点
sealed 修饰符用于防止从所修饰的类派生出其它类。如果一个密封类被指定为其他类的基类,则会发生编译时错误。 密封类不能同时为抽象类。sealed 修饰符主要用于防止非有意的派生,但是它还能促使某些运行时优化。具体说来,由于密封类永远不会有任何派生类,所以对密封类的实例的虚拟函数成员的调用可以转换为非虚拟调用来处理。    

虚函数的用法
1)virtual指明一成员函数为虚函数,而virtual仅用于类的定义里,在类外可不加此关键字.    
2)一个类的成员函数被定义为虚函数时,子类该函数仍保持虚函数特征.     
3)子类覆盖此函数时,定义里可不加virtual关键字,但函数声明要和基类的完全一致!且此声明是必须的.     
4)不是纯虚函数时,父类的虚函数必须要实现; 而若将父类的虚函数设定为纯虚函数时,子类必需要覆盖之而且必须要实现之!

解释virtual、sealed、override和abstract的区别
virtual申明虚方法的关键字,说明该方法可以被重写    
sealed说明该类不可被继承     
override重写基类的方法    
abstract申明抽象类和抽象方法的关键字,抽象方法不提供实现,由子类实现,抽象类不可实例化。    

重载和覆写有什么区别?
重载是方法的名称相同,不同的参数类型,不同的参数个数,不同的参数顺序。覆写提供了子类中改变父类方法行为的实现(是进行基类中函数的重写)。

在方法定义中,virtual有什么含义?
被virtual修饰的方法可以被子类覆写

能够将非静态的方法覆写成静态方法吗?
不能,覆写方法的签名必须与被覆写方法的签名保持一致,除了将virtual改为override。

可以覆写私有的虚方法吗?
不可以,甚至子类中无法访问父类中的私有方法

能够阻止某一个类被其他类继承吗?
可以,使用关键字sealed

能够实现允许某个类别继承,但不允许其中的某个方法被覆写吗?
可以,标记这个类为public,并标记这个方法为sealed。    

如何区别重载方法?
不同的参数类型,不同的参数个数,不同的参数顺序


c#继承:
base 表示当前对象基类的实例(使用base关键字可以调用基类的成员)this表示当前类的实例
在静态方法中不可以使用base和this关键字
派生类会继承基类所有的成员但是构造函数和析构函数不会被继承
注意如果派生类的方法和基类的方法同名则基类中的方法将会被隐藏如果需要隐藏则可以使用关键字new来隐藏如果不写new关键字默认处理为隐藏虽然基类中同名的方法被隐藏了但是还是可以通过base关键字来调用
//如果子类方法的方法名和基类的方法名相同时,系统将隐藏基类同名方法,自动调用子类的同名方法
//派生类会继承基类所有的成员,但是不能显示调用基类的是有成员
//在派生类中不可以调用基类的是有成员,如num1,num2,但是可以实现调用基类方法
virtual 用在基类中指定一个虚方法属性表示这个方法属性可以重写
override 用在派生类中表示对基类虚方法属性的重写

不能重写非虚方法或静态方法重写的基方法必须是 virtualabstract 或 override 的为什么 override 也可以重写呢因为基类中的 override 实际上是对基类的基类进行的重写由于继承可传递所以也可以对基类中 override 的方法进行重写override 声明不能更改 virtual 方法的可访问性override 方法和 virtual 方法必须具有相同的访问级别修饰符不能使用修饰符 newstaticvirtual 或 abstract 来修改 override 方法重写属性声明必须指定与继承属性完全相同的访问修饰符类型和名称并且被重写的属性必须是 virtualabstract 或 override 的标记允许被重写修饰静态方法中不允许使用virtual关键字成员变量允许使用virtual关键字属性可以被声明为虚属性(使用virtual关键字)重写基类的方法(重写同名的方法中有virtual关键字的方法)重写和隐藏的区别隐藏(new关键字)是给子类的同名方法分配新的内存空间重写(override关键字)是子类的同名方法放在基类同名方法的原来所在位置基类的同名方法位置向后移属性也可以重写


virtual关键字和override关键字是成对出现的否则是语法错误
派生类可以通过将重写声明为 sealed 来停止虚拟继承这需要在类成员声明中的 override 关键字前面放置 sealed 关键字
在子类中重写基类中的虚方法时可以使用base关键字调用基类中的虚方法


//使用base关键可以在子类中访问基类同名的方法


//父类的引用指向子类的实例


Test ts = new Test2();

父类的引用指向子类的实例(调用的是子类的方法)
父类的引用只认识父类的方法不认识子类的新方法可以用来调用被子类覆盖的父类的方法
父类的引用依然到父类方法位置去调用如果基类方法被声明为virtual并且在子类中被override结果访问到的是被子类override的方法

C#中的委托是什么?事件是不是一种委托?    
委托可以把一个方法作为参数代入另一个方法。委托可以理解为指向一个函数的引用。是,是一种特殊的委托

C#中的堆和栈
栈(Stack)由系统管理生存期,存储代码执行和调用路径,执行或调用完毕即从栈中清除;
堆(Heap)中保存值和对象,调用完毕之后依然存在,由垃圾回收器查找栈中有无指向该值或对象的引用,无则从堆中删除


C# ref与out区别:
1、使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。
2、使用ref和out时,在方法的参数和执行方法时,都要加Ref或Out关键字。以满足匹配。
3、out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。

你对泛型了解吗?简单说明一下泛型的有什么好处?
泛型:通过参数化类型来实现在同一份代码上操作多种数据类型。利用“参数化类型”将类型抽象化,从而实现灵活的复用    
好处是——类型安全和减少装箱、拆箱。提高性能、类型安全和质量,减少重复性的编程任务     

C#中所有对象共同的基类是什么?
System.Object.

如何在C#中实现继承?
在类名后加上一个冒号,再加上基类的名称。    

C#支持多重继承吗?
不支持。可以用接口来实现。

被protected修饰的属性/方法在何处可以访问?
在继承或间接继承与这个类的子类中可以访问。    

私有成员会被继承么?
会,但是不能被访问。所以看上去他们似乎是不能被继承的,但实际上确实被继承了。    

C#提供一个默认的无参构造函数,当我实现了另外一个有一个参数的构造函数时,还想保留这个无参数的构

造函数。这样我应该写几个构造函数?
两个,一旦你实现了一个构造函数,C#就不会再提供默认的构造函数了,所以需要手动实现那个无参构造函数。    

简述 private、 protected、 public、 internal 修饰符的访问权限。
private : 私有成员, 在类的内部才可以访问。    
protected : 保护成员,该类内部和继承类中可以访问。     
public : 公共成员,完全公开,没有访问限制。     
internal: 在同一命名空间内可以访问。

new的两种用法
实例话对象,隐藏基类方法。

.new有几种用法
第一种:new Class();
第二种:覆盖方法
public new XXXX(){}
第三种:new 约束指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数。

3.datagrid.datasouse可以连接什么数据源 [dataset,datatable,dataview]

dataset,datatable,dataview , IList

类成员有( )种可访问形式

可访问性:public ,protected ,private,internal    


委托与事件的用法
public delegate void handels();//返回值是void,没有参数    
public event handels eventHandels;     
his.eventHandels = new handels(fun);     
public void fun()     
    { }


传入某个属性的SET方法的隐含参数的名称是什么?
value,它的类型和属性所声明的类型相同。    

string是值类型还是引用类型?
引用类型

String类与StringBuilder类有什么区别?为什么在.Net类库中要同时存在这2个类?(简答)

stringBuilder比string更节约内存,所以stringBuilder更快String 对象是不可改变的。每次使用 System.String 类中的方法之一或进行运算时(如赋值、拼接等)时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。而 StringBuilder 则不会。在需要对字符串执行重复修改的情况下,与创建新的 String 对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用 System.Text.StringBuilder 类。例如,当在一个循环中将许多字符串连接在一起时,使用 StringBuilder 类可以提升性能。    

在C#中,string str = null 与 string str = “” 请尽量使用文字或图象说明其中的区别。
string str = null 是不给他分配内存空间,而string str = "" 给它分配长度为空字符串的内存空间。  

ASP.net的身份验证方式有哪些?分别是什么原理?
Windwos(默认)      用IIS...From(窗体)      用帐户....Passport(密钥)

Session有什么重大BUG,微软提出了什么方法加以解决?
是iis中由于有进程回收机制,系统繁忙的话Session会丢失,可以用Sate server或SQL Server数据库的方式存储Session不过这种方式比较慢,而且无法捕获Session的END事件    

c#中的三元运算符是 ?:
.能用foreach遍历访问的对象需要实现() 接口或声明 ( GetEnumerator)方法的类型。
.<%# %> 和 <% %> 有什么区别?
<%# %>表示绑定的数据源 <% %>是服务器端代码块 常量

在.net(C# or vb.net)中如何获得当前窗体或控件的句柄,特别是控件本身的句柄(请列举)

this(C#) Me(vb.net).

.C#可否对内存进行直接的操作?
在.net下,.net引用了垃圾回收(GC)功能,它替代了程序员 不过在C#中,不能直接实现Finalize方法,而是在析构函数中调用基类的Finalize()方法

DateTime是否可以为null?
不能,因为其为Struct类型,而结构属于值类型,值类型不能为null,只有引用类型才能被赋值null    

DateTime.Parse(myString); 这行代码有什么问题?
有问题,当myString不能满足时间格式要求的时候,会引发异常,建议使用DateTime.TryParse()    

net的错误处理机制是:
采用try->catch->finally结构,

为什么不提倡catch(Exception)
try..catch在出现异常的时候影响性能; 应该捕获更具体得异常,比如IOExeception,OutOfMemoryException等    

catch(Exception e){throw e;}和catch(Exception e){throw;}的区别
将发生的异常对象抛出,另一个只是抛出异常,并没有抛出原异常对象)

error和exception区别:
error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。
exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。

GET与POST的区别
在FORM提交的时候,如果不指定Method,则默认为GET请求,Form中提交的数据将会附加在url之后,以?分开与url分开。字母数字字符原样 发送,但空格转换为“+“号,其它符号转换为%XX,其中XX为该符号以16进制表示的ASCII(或ISO  Latin-1)值。GET请求请提交的数据放置在HTTP请求协议头中,而POST提交的数据则放在实体数据中;在使用 POST 方法的情况下,传输数据时不会将数据作为 URL 的一部分;它们会作为一个独立的实体来传输。因此,POST 方法更安全,你也可以用这个方法传输更多的数据。而且用 POST 传输的数据不一定要是文本,用 GET 方法传输的却一定要是文本。
(1)get是从服务器上获取数据,post是向服务器传送数据。
(1)在客户端,Get方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据放置在HTML HEADER内提交。
(2)对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
(2)GET方式提交的数据最多只能有1024字节,而POST则没有此限制。
(3)安全性问题。正如在(1)中提到,使用 Get 的时候,参数会显示在地址栏上,而 Post 不会。所以,如果这些数据是中文数据而且是非敏感数据,那么使用 get;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用 post为好。

Bind和Eval函数的区别
绑定表达式
<%# Eval("字段名") %>
<%# Bind("字段名") %>
1  Eval 单向绑定:数据是只读的    
    Bind 双向绑定:数据可以更改,并返回服务器端,服务器可以处理更改后的数据,如存入数据库.     
2.当对次表达式操作时候,必须用Eval 如<%# Eval("字段名").ToString().Trim() %>     
3 绑定控件的属性时要用Bind,而Eval则是其它一些。     
    例如:     
    例如:<%# Eval("ProductID") %>

Response.Redirect和Server.Transfer
请求的过程:    
1)浏览器aspx文件请求--->服务器执行--->遇到Response.Redirect语句->服务器发送Response.Redirect后面的地址给客户机端的浏览器--->浏览器请求执行新的地址
2)浏览器aspx文件请求->服务器执行->遇到Server.Transfer语句->服务器转向新的文件可以见Server.Transfer比Response.Redirect少了一次服务器发送回来和客户端再请求的过程.
跳转对象:    
1)Response.Redirect可以切换到任何存在的网页。
2)Server.Transfer只能切换到同目录或者子目录的网页.
数据保密:    
1、Response.Redirect后地址会变成跳转后的页面地址。
2、Server.Transfer后地址不变,隐藏了新网页的地址及附带在地址后边的参数值。具有数据保密功能。传递的数据量(网址后附带的参数):
1、Response.Redirect能够传递的数据以2KB(也就是地址栏中地址的最大的长度)为限。
2、传递的数据超过2KB时,务必使用Server.Transfer。


Server.UrlEncode、HttpUtility.UrlDecode的区别
Server.UrlEncode的编码方式是按照本地程序设置的编码方式进行编码的,而HttpUtility.UrlEncode是默认的按照.net的utf-8格式进行编码的。

Static 和 非Static的区别:
一、用Static声明的方法和变量,不需要实例化该类就调用;
二、Static的,就一定要用实例化的对象来调用,即用new来实例化。
举例说:
如果有一个类People,有一个Static的方法MiaoShu(), 调用方法就是 People.MisoShu()
有一个非Static的方法getName(), 调用方法就是 People p= new People(); p.getName();

如何实现连接池
确保你每一次的连接使用相同的连接字符串(和连接池相同);只有连接字符串相同时连接池才会工作。如果连接字符串不相同,应用程序就不会使用连接池而是创建一个新的连接。
优点
使 用连接池的最主要的优点是性能。创建一个新的数据库连接所耗费的时间主要取决于网络的速度以及应用程序和数据库服务器的(网络)距离,而且这个过程通常是 一个很耗时的过程。而采用数据库连接池后,数据库连接请求可以直接通过连接池满足而不需要为该请求重新连接、认证到数据库服务器,这样就节省了时间。
缺点
数据库连接池中可能存在着多个没有被使用的连接一直连接着数据库(这意味着资源的浪费)。
技巧和提示
1. 当你需要数据库连接时才去创建连接池,而不是提前建立。一旦你使用完连接立即关闭它,不要等到垃圾收集器来处理它。
2. 在关闭数据库连接前确保关闭了所有用户定义的事务。
3. 不要关闭数据库中所有的连接,至少保证连接池中有一个连接可用。如果内存和其他资源是你必须首先考虑的问题,可以关闭所有的连接,然后在下一个请求到来时创建连接池。

连接池FAQ

1. 何时创建连接池?
当第一个连接请求到来时创建连接池;连接池的建立由数据库连接的连接字符创来决定。每一个连接池都与一个不同的连接字符串相关。当一个新的连接请求到来时如果连接字符串和连接池使用的字符串相同,就从连接池取出一个连接;如果不相同,就新建一个连接池。
2. 何时关闭连接池?
当连接池中的所有连接都已经关闭时关闭连接池。
3. 当连接池中的连接都已经用完,而有新的连接请求到来时会发生什么?
当连接池已经达到它的最大连接数目时,有新的连接请求到来时,新的连接请求将放置到连接队列中。当有连接释放给连接池时,连接池将新释放的连接分配给在队列中排队的连接请求。你可以调用close和dispose将连接归还给连接池。
4. 我应该如何允许连接池?
对于.NET应用程序而言,默认为允许连接池。(这意味着你可以不必为这件事情做任何的事情)当然,如果你可以在SQLConnection对象的连接字符串中加进Pooling=true;确保你的应用程序允许连接池的使用。
5. 我应该如何禁止连接池?
ADO.NET默认为允许数据库连接池,如果你希望禁止连接池,可以使用如下的方式:
1) 使用SQLConnection对象时,往连接字符串加入如下内容:Pooling=False;
2) 使用OLEDBConnection对象时,往连接字符串加入如下内容:OLE DB Services=-4;

提高.NET的性能
1 使用异步方式调用Web服务和远程对象
只要有可能就要避免在请求的处理过程中对Web服务和远程对象的同步调用,因为它占用的是的ASP.NET 线程池中的工作线程,这将直接影响Web服务器响应其它请求的能力。
2 使用适当的Caching策略来提高性能
3 判断字符串,不要用""比较。
//避免    
if(strABC!=null && strABC!="")     
{}

//推荐    
if(!strABC.IsNullOrEmpty)     
{}

4 页面优化
5 用完马上关闭数据库连接    
6 尽量使用存储过程,并优化查询语句     
7 只读数据访问用SqlDataReader,不要使用DataSet

……….


.UDP连接和TCP连接的异同
答:前者只管传,不管数据到不到,无须建立连接.后者保证传输的数据准确,须要连结.

请解释转发与跳转的区别
转发就是服务端的跳转A页面提交数据到B页面,B页面进行处理然后从服务端跳转到其它页面
跳转就是指客户端的跳转

简述你对XML Web Service的原理的认识?
答:利用SOAP(简单对象访问协议)在http上执行远程方法的调用,也可以使用WSDL(Web服务描述语言)来

完成完整的描述Web服务,然后用UDDI注册各个服务提供商提供的服务,以便共享他们。

什么叫应用程序域?
答:应用程序域可以理解为一种轻量级进程。起到安全的作用。占用资源小。

CTS、CLS、CLR分别作何解释?
答:CTS:通用语言系统。CLS:通用语言规范。CLR:公共语言运行库。

什么是受管制的代码?
答:unsafe:非托管代码。不经过CLR运行。

什么是强类型系统?
答:RTTI:类型识别系统。
什么是code-behind技术
codebehind是指代码和用户界面分开
aspx and cs

在.net中,配件的意思是?
答:程序集。(中间语言,源数据,资源,装配清单)

常用的调用WebService的方法有哪些?
答:1.使用WSDL.exe命令行工具。
    2.使用VS.NET中的Add Web Reference菜单选项

net Remoting 的工作原理是什么?
答:服务器端向客户端发送一个进程编号,一个程序域编号,以确定对象的位置。
O/R Mapping 的原理
答:利用反射,配置将对象和数据库表映射

remoting和webservice两项技术的理解以及实际中的应用。
答:WS主要是可利用HTTP,穿透防火墙。而Remoting可以利用TCP/IP,二进制传送提高效率。

out保留字怎么使用,什么时候使用
答:有时为了从一个函数中返回多个值,我们需要使用out关键字,把输出值赋给通过引用传递给方法的变量(也就是参数)。但C#要求变量再被引用的前必须初始化。在调用该方法时,还需要添加out关键字

PDB是什么东西? 在调试中它应该放在哪里?
PDB是用于保存调试和项目状态信息的文件,在debug的时候将产生pdb文件,调试的时候应该放在和对应应用程序集相同目录。


使用ASMX的XML Web服务与使用SOAP的.NET Remoting的区别?
Web服务使用的消息机制,而Remoting采用的RPC. Web Service能用于不同平台,不同语言,Remoting只适用于.Net。效率上Remoting高于Xml Web Service

调用Assembly.Load算静态引用还是动态引用?
动态

列举一下你所了解的XML技术及其应用
答:保存配置,站与站之间的交流,WEB SERVICE。以及与数据库的数据交互等地方都要用它.

7.如何理解委托?
答:
相当于函数指针,定义了委托就可以在不调用原方法名称的情况下调用那个方法.
委托具有以下特点:
委托类似于 C++ 函数指针,但它是类型安全的。
委托允许将方法作为参数进行传递。
委托可用于定义回调方法。
委托可以链接在一起;例如,可以对一个事件调用多个方法。
方法不需要与委托签名精确匹配。有关更多信息,请参见协变和逆变。
C# 2.0 版引入了匿名方法的概念,此类方法允许将代码块作为参数传递,以代替单独定义的方法。

概述反射和序列化
反射:程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。在另一端,反序列化将从该流重新构造对象。

XmlSerializer是如何工作的?使用这个类的进程需要什么ACL权限?
我只知道XmlSerializer是将对象的属性和字段进行序列化和反序列化的,序列化成为xml数据,反序列化再将xml转换成对象。应该至少需要ACL权限中的读权限.

23)XmlSerializer使用的针对属性的模式有什么好处?解决了什么问题?
只序列化有用的数据,而不是序列化整个对象。实现没必要的数据冗余,和提升序列化时的性能。

26.根据委托(delegate)的知识,请完成以下用户控件中代码片段的填写:
namespace test
{
public delegate void OnDBOperate();
public class UserControlBase : System.Windows.Forms.UserControl
{
public event OnDBOperate OnNew;
privatevoidtoolBar_ButtonClick(objectsender,System.Windows.Forms.ToolBarButtonClickEventArgs e)
{
if(e.Button.Equals(BtnNew))
{
//请在以下补齐代码用来调用OnDBOperate委托签名的OnNew事件。
}
}
}
答:if( OnNew != null )
    OnNew( this, e );

27.分析以下代码,完成填空
string strTmp = "abcdefg某某某";
int i= System.Text.Encoding.Default.GetBytes(strTmp).Length;
int j= strTmp.Length;
以上代码执行完后,i= j=
答:i=13,j=10

28.SQLSERVER服务器中,给定表 table1 中有两个字段 ID、LastUpdateDate,ID表示更新的事务号,LastUpdateDate表示更新时的服务器时间,请使用一句SQL语句获得最后更新的事务号
答:Select ID FROM table1 Where LastUpdateDate = (Select MAX(LastUpdateDate) FROM table1)

29.根据线程安全的相关知识,分析以下代码,当调用test方法时i>10时是否会引起死锁?并简要说明理由。
public void test(int i)
{
   lock(this)
{
   if (i>10)
   {
     i--;
     test(i);
   }
}
}
答:不会发生死锁,(但有一点int是按值传递的,所以每次改变的都只是一个副本,因此不会出现死锁。但如果把int换做一个object,那么死锁会发生)

相关文章

精彩推荐