.net面试题升级版

一、列举ASP.NET页面之间传值的几种方式
答:使用QueryString,如.../id=1;response.Redirect()
使用Session
使用Server.Transfer
使用Cookie

二、简述private、protected、public、internal修饰符的访问权限。
答:privata:私有成员,在类的内部才能够访问
protected:保护成员,该类内部和继承类能够访问
public:公开成员,没有访问限制
internal: 当前程序集能够访问

三、简述ADO.NET中的五个主要对象。
答:Connection:主要是开启程序和数据库之间的链接。没有利用链接对象将数据库打开,是没法从数据库中取得数据的。Close和Dispose的区别,Close之后还能够Open,Dispose之后则不能再用。
Command:主要能够用来对数据库发出一些指令,例如能够对数据库下达查询、新增、修改、删除数据等指令,以及调用存在数据库中的存储过程等。这个对象是架构在Connection 对象上,也就是Command 对象是透过链接到数据源。
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 对象操做数据结果。

四、请简述.NET中类与结构的异同
答:class能够被实例化,属于引用类型,是分配在内存的堆上的。类是引用传递。
struct属于值类型,是分配在内存的栈上的。结构是值传递。
int3二、boolean都属于结构。

五、override与重载(overload)的区别
答:重载是方法的名称相同。参数或参数类型不一样,进行屡次重载以适应不一样的须要。
重载是面向过程的概念。override是进行基类中函数的重写,是面向对象的概念。


6,什么是面向对象
面向对象OO = 面向对象的分析OOA + 面向对象的设计OOD + 面向对象的编程OOP; 通俗的解释就是万物皆对象,把全部的事物都看做一个个能够独立的对象(单元),它们能够本身完成本身的功能,而不是像C那样分红一个个函数; 如今纯正的OO语言主要是java和C#,C++也支持OO,C是面向过程的。java

7,静态成员和实例成员的区别
(1)语法区别:静态成员有关键字static,非静态成员无static修饰;程序员

(2)存储区别: 静态成员变量存储位于程序的全局变量存储区,其做用域限制为类内部,而且在整个程序运行期间只在内存中拥有一个存储位置,不会拷贝不会复制,只是一个;web

非静态成员变量存储位于对象的变量存储区,多个对象拥有多个变量的存储,只隶属于本身的的对象算法

(3)归属区别:静态成员隶属于类,是类的财产,不管对一个类建立多少个实例,它的静态成员都只有一个副本,在各个地方的改变都会改变其值;sql

非静态成员隶属于它的对象,各自对象同一个非静态成员值的改变都不互相影响,有多少实例就有多少副本;数据库

(4)生存周期区别: 知道了存储位置的区别也就不难理解生存周期的差别了,静态成员只要分配了空间则在整个程序运行期间,它都是存在的,只有程序关闭以后,它的内存才会被GC回收器收回,不过做用域仍然只限制于类的内部,在类外部调用时须要使用类 名加点的方式访问;编程

类的非静态成员的生存周期跟随于隶属于对象的生存周期,对象消亡则非静态成员就会被回收;设计模式

(5)初始化顺序的区别:初始化都是最早初始化类的静态成员,而后才是非静态数据成员。
8,什么是存储过程,有什么优势
存储过程是一组予编译的SQL语句跨域

它的优势:数组

      1.容许模块化程序设计,就是说只须要建立一次过程,之后在程序中就能够调用该过程任意次。

  2.容许更快执行,若是某操做须要执行大量SQL语句或重复执行,存储过程比SQL语句执行的要快。

     3.减小网络流量,例如一个须要数百行的SQL代码的操做有一条执行语句完成,不须要在网络中发送数百行代码。

  4.更好的安全机制,对于没有权限执行存储过程的用户,也可受权他们执行存储过程。

附加:cache:在计算机存储系统的层次结构中,介于中央处理器和主存储器之间的高速小容量存储器。它和主存储器一块儿构成一级的存储器。
消息队列(MQ)是一种应用程序对应用程序的通讯方法。
CLR common language runtime 就是运行时至关于一个运行环境(至关于JVM)
IL intermidiate language中间语言,C#先编译成中间语言再在CLR上面执行
九、new有几种用法?
答:一、new Class();
二、覆盖方法,public new XXXX();
三、new() 约束指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数

十、用sealed修饰的类有什么特色?
答:sealed修饰符用于防止从所修饰的类派生出其余类。若是一个密封类指定为其余类的基类,则会发生编译错误。
密封类不能同时为抽象类。
sealed修饰符主要用于防止非有意的派生,他还能促使某些运行时优化。
String就是用sealed修饰的密封类,因此不能被继承。

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

十二、一个数组:1,1,2,3,5,8,13,21...,求第30位数是多少?
答:int[] arr = new int[30];
arr[0] = 1;
arr[1] = 1;

for (int i = 2; i < arr.Length; i++)
{
arr[i] = arr[i-1] + arr[i-2];
}
Console.WriteLine(arr[29]);
Console.ReadLine();

1三、请简述面向对象的多态的特性及意义
答:简单来讲,多态是具备表现多种形态的能力特征,在OO中是指,语言根据对象的类型的不一样,以不一样的方式处理。
特别是重载方法和继承类这种形式的能力。
多态被认为是面向对象语言的必备特性。
面向对象的语言使用虚方法表达多态。
这意味着派生类能够有和父类具备一样签名的方法,而且父类能够调用派生类的方法。
在C#中,必须使用virtual关键字才能使方法被父类调用。


或者:面向对象的编程使用了派生继承以及虚函数机制.一个原本指向基类的对象指针能够指向其派生类的.并访问从基类继承而来的成员变量和函数.而虚函数是专门为这个特性设计的,这个函数在每一个基类的派生类中都是同一个名字,但函数体却并不必定相同,派生类每每为实现本身的功能而修改这个虚函数.这样用一个指针就可以实现对多种不一样的派生类的访问, 并实现其派生类的特定功能(代码 )
1四、请编程遍历winform窗口上全部TextBox控件,并给它的Text属性赋值为string.Empty。
答:using System.Windows.Forms;
foreach (Control control in this.Controls)
{
if(control is TextBox)
{
TextBox tb = (TextBox)control;
tb.Text = String.Empty;
}
}

1五、什么是装箱(inboxing)和拆箱(unboxing)。
答:装箱:将一个值类型隐式地转换成一个object类型,或把这个值类型转换成一个被该值类型应用的接口类型,把一个值类型的值装箱,就是建立一个object实例并将值复制给这个object
拆箱:和装箱相反,拆箱转换是指将一个对象类型显式地转换成一个值类型,或将一个接口类型显式地转换成一个执行该接口的值类型。
object obj = null;
obj = 1;//装箱,把值类型包装成引用类型。
int num = (int)obj;// 拆箱,显示类型转换。

1六、如何理解三层架构。
答:三层架构就是将整个业务应用划为:表现层、业务逻辑层、数据访问层。
区分层次的目的即为了“高内聚,低耦合”的思想。
表现层:通俗讲就是展示给用户的界面,即用户在使用一个系统的时候的所见所得。
业务逻辑层:针对具体问题的操做,也能够说是对数据层的操做,对数据业务逻辑处理。
数据访问层:该层所作事务直接操做数据库,针对数据的增删改查等。
每层之间是一种垂直关系。
三层架构是N层架构的一种,通常来讲,层次之间是向下依赖的,下层代码未肯定其接口前,上层代码是没法开发的,下层代码接口的变化将使上层的代码一块儿变化。
优势:分工明确,条理清晰,易于调试,并且具备扩展性。
缺点:增长系统复杂度,增长成本。

1七、写一个冒泡排序(从小到大)
答:int[] myInts = { 11, 22, 33, 44, 55 ,66};
int temp = 0;
int count = 0;
for (int i = 1; i <= myInts.Length - 1; i++)
{
//bool 是否须要排序 = false;
for (int j = myInts.Length - 1; j >= i; j--)
{
if (myInts[j] < myInts[j - 1])
{
temp = myInts[j];
myInts[j] = myInts[j - 1];
myInts[j - 1] = temp;
}
count++;
}
}

1八、数据库三范式是什么?
答:1NF,确保每列保持原子性
2NF,确保表中的每列都和主键相关
3NF,确保每列都和主键列直接相关,而不是间接相关


1九、能用foreach遍历访问的对象有什么要求?
答:须要实现IEnumerable接口或声明GetEnumerator方法的类型。

20、GC是什么?为何要有GC?
答:GC是垃圾收集器。
程序员不用担忧内存管理,由于垃圾收集器会自动进行管理。
GC只能处理托管内存资源的释放,对于非托管资源则不能使用GC回收内存,必须由程序员手工回收。

2一、说出五个集合类。
答:List、Dictionary、Stack、Queue、Tree等

2二、不用JQuery等库,原生JS使用AJAX实现登录。
答:window.onload = function () {
document.getElementById('btn').onclick = function () {
var username = document.getElementById('username').value;
var password = document.getElementById('password').value;
var xhr = new XMLHttpRequest();
xhr.open('POST','/url?username=' + username + '&password=' + password, true);
xhr.onreadystatechange = function () {
if(xhr.readyState === 4) {
if (xhr.status === 200) {
alert('登录成功')
} else {
alert('登录失败')
}
}
}

}
}

2三、你以为如何才能提升代码的效率和性能(能够列举多种思路,越多越好)?
答:能够根据业务流程、业务数据的特色进行优化,好比能够采用缓存、索引等来提升代码的效率和性能。
同时不要进行无心义的代码优化,重点优化系统的性能瓶颈。
按照设计模式去编写代码,完全的面向对象编程,多用委托事件。
尽可能作到方法的每个实现代码只写一遍。
2四、什么是Code-Behind技术?
答:Code-Behind是代码隐藏。
在ASP.NET中经过ASPX页面指向CS文件的方法显示逻辑和处理逻辑的分离,这样有助于web应用程序的建立。
Code-Behind是基于部分类技术实现的。

2五、using关键字有什么用?什么是IDisposable?
答:using能够声明namespace的引入,还能够实现非托管资源的释放,实现了IDisposable的类在using中建立对象,using结束后会自动调用Dispose方法,释放资源。
using其实等价于于try...finally,用起来更方便。

2六、String是值类型仍是引用类型?它是如何工做的。
答:String是引用类型。
String的值是不可变的,当对String类型的对象从新赋值时,这个对象的引用指向就会变成一个新的引用,而原来的那个值并无改变,只是引用改变了。

2七、简述堆与栈的区别。
答:栈是编译期间就分配好的内存空间,所以你的代码中必须就栈的大小有明确的定义;局部值类型变量、值类型参数等都在栈中。

堆是程序运行期间动态分配的内存空间,你能够根据程序的运行状况肯定要分配的堆内存的大小。

2八、有一个8个数的数组{1,2,3,3,4,5,6,6},计算其中不重复数字的个数。
答:int values = {1,2,3,3,4,5,6,6};
HashSet<int> set = new HashSet<int>();
foreach(int i in values)
{
set.Add(i);
}

Console.WriteLine(set.Count)
2九、是否能够从一个static方法内部发出对非static方法的调用?
答:不能够。由于非static方法与对象相关联,必须建立一个对象后,才能够在该对象上进行方法调用,而static方法调用时不须要建立对象,能够直接调用。
也就是说,当一个static方法被调用时,可能尚未建立任何实例对象,若是从一个static方法中调用一个非static方法,那么非static方法没有关联的对象,因此不能够。

30、说出一些经常使用类、接口,请各列举5个
答:类:StreamReader、StringBuilder、SqlConnection、FileStream、File、Regex
接口:IDisposable、IEnumerable、IComparable、ICollection、IList

3一、C#支持多重继承么?
答:类之间不支持,接口之间支持。
类对接口叫作实现,不叫继承。
类是爹、接口是能力,能力能够有多个,但不能有多个爹。

3二、简单说明数据库创建索引的优缺点。
答:优势,使用索引能够加快数据的查询速度。
缺点,插入数据过程当中会创建索引,因此会下降数据的插入、更新速度,还会占用磁盘。
3三、经过超连接<a>如何传递中文参数。
答:用URL编码,经过QueryString传递,用System.Web.HttpUtility.UrlEncode编码 用System.Web.HttpUtility.UrlDecode解码。

3四、Ajax解决什么问题?如何使用Ajax?Ajax有什么问题须要注意?
答:AJAX解决的问题就是“无刷新更新页面”,用传统的HTML表单方式进行页面的更新时,每次都要将请求提交到服务器,服务器返回后再重绘界面。
这样界面就会经历:提交→变白→从新显示这样一个过程,用户体验很是差,使用AJAX则不会致使页面从新提交、刷新。
AJAX最本质的实现是在Javascript中使用XMLHttpRequest进行Http的请求,开发中一般使用UpdatePanel、JQuery等方式简化AJAX的开发。
使用XmlHttpRequest实现Ajax请求。
Ajax最重要的问题是没法跨域请求,也就是没法在再页面中向和当前域名不一样的页面发送请求。

3五、你常常访问的技术类网站是什么?
答:博客园、CSDN、GitHub、MSDN、MDN、CnBate、CodePlex

3六、Session有什么缺陷?微软提出了什么方法加以解决。
答:iis中因为有进程回收机制,系统繁忙的话Session会丢失,IIS重启也会丢失。
能够用SateServer或SQL Server数据库的方式存储Session不过这种方式比较慢,并且没法捕获Session的END事件。
SateServer还能够解决集群Session共享的问题。

3七、ASP.NET中的错误机制。
答:ASP.NET四种错误处理机制,分别是:Page_Error(不经常使用),Application_Error(应用程序中的未捕获异常),<customErrors>四种。
若是一个表查询比写入频繁能够创建索引,若是写入比查询频繁,就不建议创建索引。

3八、SQL注入漏洞产生的缘由?如何防止。
答:程序开发过程当中不注意书写sql语句和对特殊字符进行过滤,致使客户端能够提交一些sql语句正常执行。
一、sql语句尽可能不要省略引号和单引号。
二、过滤掉SQL语句中的一些关键字。
三、控制错误信息,不要再浏览器上输出错误信息。
四、使用SqlParameter类,尽可能不要拼接字符串SQL语句。
3九、如何提升页面的显示速度?假如一个页面的加载时间是10.89S,你会用什么样的方式优化。
答:首先要找出问题所在,是服务器端运行的速度慢仍是服务器端到客户端的下载慢仍是页面在浏览器的加载速度慢。
若是是服务器端运行速度慢,则找是数据库的缘由仍是算法的问题,若是是数据库的问题则尝试添加索引、优化SQL语句,若是是算法的问题,则优化算法。
若是对于一些不常常改动的页面可使用静态页技术!
对于一些数据不须要及时更新的并且取数据的过程很是耗时可使用缓存。
页面中的内容能够按需加载(好比说能够像网站的评论那样当用户须要看的时候再加载其内容)
能够在图片须要显示的时候再进行加载。
若是是服务器端到客户端的下载慢则看是页面体积过于臃肿仍是网络问题,
若是是页面体积过于臃肿,则优化HTML代码,去掉无用的标签,压缩JS、CSS,能够用CSS Spirit技术将多个图片放到一个图片中,减小向服务器的请求。
若是是网络问题,则尝试在不一样的网络、地区部署服务器,而后使用CDN技术加速访问。
若是是页面中的JavaScript运行复杂致使运行速度慢,则优化JavaScript。

40、你会采用什么样的策略和方法来实现系统缓存。
答:在ASP.NET中 缓存有 页面缓存,数据源缓存,和一些本身定义的缓存!
对于那些整个页面不常常变化的咱们可使用页面缓存,而对于那些执行很是耗时的SQL语句而且数据的及时性要求不高的咱们可使用数据源缓存。

4一、网站想要实现文件防盗链的功能,说说你的解决方案。
答:读取HTTP报文头中的UrlReferrer在Application_BeginRequest中咱们能够判断用户的请求是否来源于本网站。若是不是咱们能够终止用户的请求。

4二、StringBuilder和String的区别
答:String 在进行运算时(如赋值、拼接等)会产生一个新的实例,而 StringBuilder 则不会。
因此在大量字符串拼接或频繁对某一字符串进行操做时最好使用 StringBuilder,不要使用 String
若是要操做一个不断增加的字符串,尽可能不用String类,改用StringBuilder类。
两个类的工做原理不一样:String类是一种传统的修改字符串的方式,它确实能够完成把一个字符串添加到另外一个字符串上的工做没错,可是在.NET框架下,这个操做实在是划不来。
由于系统先是把两个字符串写入内存,接着删除原来的String对象,而后建立一个String对象,并读取内存中的数据赋给该对象。这一来二去的,耗了很多时间。
而使用System.Text命名空间下面的StringBuilder类就不是这样了,它提供的Append方法,可以在已有对象的原地进行字符串的修改,简单并且直接。
固然,通常状况下觉察不到这两者效率的差别,但若是你要对某个字符串进行大量的添加操做,那么StringBuilder类所耗费的时间和String类简直不是一个数量级的。

4三、对于大流量的网站,应采用什么样的方法来解决访问量问题
答:首先,确认服务器硬件是否足够支持当前的流量。
普通的P4服务器通常最多能支持天天10万独立IP,若是访问量比这个还要大,那么必须首先配置一台更高性能的专用服务器才能解决问题,不然怎么优化都不可能完全解决性能问题。

其次,优化数据库访问。
服务器的负载过大,一个重要的缘由是CPU负荷过大,下降服务器CPU的负荷,才可以有效打破瓶颈。而使用静态页面可使得CPU的负荷最小化。
前台实现彻底的静态化固然最好,能够彻底不用访问数据库,不过对于频繁更新的网站,静态化每每不能知足某些功能。
缓存技术就是另外一个解决方案,就是将动态数据存储到缓存文件中,动态网页直接调用这些文件,而没必要再访问数据库,WordPress和Z-Blog都大量使用这种缓存技术。
若是确实没法避免对数据库的访问,那么能够尝试优化数据库的查询SQL.避免使用Select * from这样的语句,每次查询只返回本身须要的结果,避免短期内的大量SQL查询。

第三,禁止外部的盗链。
外部网站的图片或者文件盗链每每会带来大量的负载压力,所以应该严格限制外部对于自身的图片或者文件盗链。

第四,控制大文件的下载。
大文件的下载会占用很大的流量,而且对于非SCSI硬盘来讲,大量文件下载会消耗CPU,使得网站响应能力降低。所以,尽可能不要提供超过2M的大文件下载, 若是须要提供,建议将大文件放在另一台服务器上。

第五,使用不一样主机分流主要流量
将文件放在不一样的主机上,提供不一样的镜像供用户下载。

第六,使用流量分析统计软件
在 网站上安装一个流量分析统计软件,能够即时知道哪些地方耗费了大量流量,哪些页面须要再进行优化,所以,解决流量问题还须要进行精确的统计分析才能够。
4四、打印出由*号组成的倒三角形的图案
******* 4*2-1 要求: 一、输入倒三角的行数,行数范围3-18,对于不在范围的行数,抛出提示.
***** 3*2-1 二、在控制台打印出指定行数的倒三角形。
***2
*1
答:while (true)
{
Console.Write("请输入一个数(3-50)之间:");
int num = Convert.ToInt32(Console.ReadLine());
if (num < 3 || num > 50)
{
Console.WriteLine("非法数值");
continue;
}

StringBuilder sb = new StringBuilder();
for (int i = 0; i < num; i++)
{
sb.Clear();
//生成空格,规则:行首空格数=行数-1
string space = "".PadLeft(i, ' ');
sb.Append(space);
//生成星号, 规则:行号*2-1,行号=num-i
string star = "".PadLeft((num - i) * 2 - 1, '*');
sb.Append(star);
Console.WriteLine(sb);
}
}

4五、什么是单例?编写一个单例类。
答:单例是一种设计模式。
这一模式的目的是使得类的一个对象成为系统中的惟一实例。
单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行建立这个实例;三是它必须自行向整个系统提供这个实例。
/// <summary>
/// 单例模式的实现
/// </summary>
public class Singleton
{
// 定义一个静态变量来保存类的实例
private static Singleton uniqueInstance;

// 定义私有构造函数,使外界不能建立该类实例
private Singleton()
{
}

/// <summary>
/// 定义公有方法提供一个全局访问点,同时你也能够定义公有属性来提供全局访问点
/// </summary>
/// <returns></returns>
public static Singleton GetInstance()
{
// 若是类的实例不存在则建立,不然直接返回
if (uniqueInstance == null)
{
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}

46、try{}里有一个return语句,那么紧跟在try后的finally{}里的代码会不会被执行,何时被执行。
答:会执行,若是return后面有一个返回值或者表达式,则会先进行计算,把值暂存起来,而后再执行finally里的代码,不管如何,return老是最后执行。

47、不用中间变量,交换两个整型变量。
答:i = 10, j = 20;
i = i + j;//i = 30;
j = i - j;//j = 10;
i = i - j;//i = 20;


48、对数据的并发采用什么方法比较好?
答:能够控制链接池的链接数量,越多越好,还可使用负载均衡。
49、short s=1;s=s+1;有错么?short s=1;s+=1;有错么?
答:short s=1;s=s+1;
这句不会经过编译(类型转换错误),由于s+1,其中1为int型,而s会隐式转换为int再和1进行运算,运算结果天然是int,而int则没法隐式转换回short,因此这里是错的。
short s=1;s+=1;
这句是则不会报错,由于s+=1,至关于s=(short)(s+1),在运算后赋值前进行了显式类型转换。

50、产生一个int数组,长度为100,并向其随机插入1-100,而且不能重复(要求使用两种方法)
答://方法一
List<int> list = new List<int>();
Random rand = new Random();
while (list.Count < 100)
{
int num = rand.Next(1, 101);
if (!list.Contains(num))
{
list.Add(num);
}
}

//方法二
int[] arr = new int[100];
for (int i = 0; i < 100; i++)
{
arr[i] = i + 1;
}
Random rand1 = new Random();
for (int i = 0; i < 100; i++)
{
int m = rand1.Next(0, 100);
int n = rand1.Next(0, 100);
int temp = arr[m];
arr[m] = arr[n];
arr[n] = temp;
}

5一、C#中的委托是什么?事件是否是一种委托?事件和委托的关系。
答:委托能够把一个方法做为参数代入另外一个方法。
委托能够理解为指向一个函数的指针。
委托是类型,事件是对象。
事件的内部是用委托实现的,对于事件来说,外部只能注册本身(+=)和注销本身(-=)。
事件内部就是一个private的委托和add(+=)、remove(-=)两个方法。

52、属性和字段的区别是什么?
答:属性能够对值的获取和设置进行控制,而字段不能。
通常状况下get读取的值就是set设置的值。
若是只有get,则说明值是只读。
若是只有set,则说明值是只写。
get和set的本质是就是内部方法。

5三、C#的接口和类有什么异同?
答:不一样点:
不能直接实例化接口。
接口不包含方法的实现。
接口能够继承,类只能单继承。
类定义可在不一样的源文件之间进行拆分。
相同点:
接口、类和结构均可以从多个接口继承实现。
继承接口的任何非抽象类型都必须实现接口的全部成员。
接口和类均可以包含事件、索引、方法和属性。
5四、什么状况下会用到虚方法?它与接口有什么不一样?
答:子类从新定义父类的某一个方法时,必须把父方法定义为virtual。
在定义接口中不能有方法体,虚方法能够。
实现时,子类能够能够不从新定义虚方法,但若是一个类继承接口,那必须实现这个接口。
5五、常见的HTTP状态码有哪些?各是什么意思?
答:200:(成功) 服务器已成功处理了请求 。一般,这表示服务器提供了请求的网页
400 :(错误请求) 服务器不理解请求的语法
404:(未找到) 服务器找不到请求的网页。
302 :(临时移动) 服务器目前从不一样位置的网页响应请求,但请求者应继续使用原有位置来进行之后的请求。
500 :(服务器内部错误) 服务器遇到错误,没法完成请求。

5六、abstract class和interface有什么区别?
答:相同点:
都不能被直接实例化,均可以继承实现其(抽象)方法。
不一样点:
接口支持多继承,抽象类不能实现多继承。
接口只能定义行为,抽象类既能够定位行为,还能提供实现。
接口只包括:方法、属性、索引器、事件的签名,不能定义字段和包含实现的方法。
抽象类能够定义字段、属性、包含实现的方法。
接口可用做于结构和类,抽象只能用做于类。
结构能够继承接口,而不能继承类。

5七、简述属性与索引器的区别?
答:属性用于以可验证的方式访问私有成员变量。索引器用于以更便捷的方式访问对象中包含的成员数组或集合。
区别:
一、属性名可自定义,索引器必须以this命名。
二、属性能够为实例或静态,索引器必须是实例的。
三、索引器有索引参数列表,而属性没有。

58、DataReader和DataSet的异同?
答:DataReader为在线操做数据, DataReader会一直占用SqlConnection链接,在其得到数据过程当中其它操做不能够再使用SqlConnection链接对象。
DataSet为离线操做数据,DataSet会将数据一次性读入内存,而后断开链接,这时其它操做就可使用SqlConnection链接对象。
因为DataReader一次只读取一行数据,因此占用内存较小。但DataReader为只进且只读的,也就是只能单方向向前读取,若是你想回头去读取上一条数据是不容许的,而且 不容许其修改数据。
因为DataSet一次性读取全部数据,因此比较消耗资源,但也提升了灵活性,在断开数据库链接状况下你能够对数据进行任何增删改查,按照任意的顺序读取数据,并能够将 其写回到数据库。
59. 值传递和引用传递的区别
答:数据类型在内存中的保存时,值类型保存在堆栈中,引用类型将它的值保存在托管堆中,在堆栈中保存的是对堆上地址的引用,
在方法中传递参数时,全部类型都是传递堆栈中的位置,具体过程为先在堆栈上复制一个传递的对象,而后将该对象传给参数,因此显而易见,数值类型保存在堆栈中,做为参 数传递时直接复制了数值的一个副本给方法,方法对该副本所作的任何操做都不会影响到该数值的原值,可是引用类型复制的是堆栈上对堆的引用,该引用指向的仍然是堆上的引 用类型,因此对应用类型所作的操做都会引发其自己的改变。


60. C#中索引器是否只能根据数字进行索引?是否容许多个索引器参数?

答:索引器就是对一个集合的快速访问方法,如一个类中有一个List类型的变量,可使用this[int index]来访问该List变量,间接的就是this.List[index],
索引器中的参数不必定是整数,也能够是其余类型,如字典使用的就是字符串,参数的个数和类型能够是任意类型
回答方式二:参数的个数和类型都是任意的。加分的补充回答:用reflector反编译能够看出,索引器的内部本质上就是set_item、get_item方法。
加分的补充回答:回答传智播客.net培训中讲解设计模式中开发的SettingsProvider就是用的string类型的参数名作索引器参数。

61. 属性和public字段的区别是什么?调用set方法为一个属性设置,而后用get方法读取出来的值必定是set进去的值吗?

答: 属性能够对设值、取值的过程进行非法值控制,好比年龄禁止设值负数,而字段则不能进行这样的设置。 虽然通常状况下get读取的值就是set设置的值,可是可让get读取的值不是 set设置的值的,极端的例子。Public Age{get{return 100;}set{}}。 加分的补充回答:用reflector反编译能够看出,属性内部本质上就是set_***、get_***方法

相关文章
相关标签/搜索