C# .NET 基本概念

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


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


3. override与overload的区别?
  override 表示重写,overload 表示重载。
  override是子类和父类之间的关系,是垂直关系;overload是同一个类中方法之间的关系,是水平关系。
  override只能由一个方法,或只能由一对方法产生关系;overload是多个方法之间的关系。
  override要求参数列表相同;overload要求参数列表不同。
  override关系中,调用那个方法体,是根据对象的类型(对象对应存储空间类型)来决定;overload关系,是根据调用时的实参表与形参表来选择方法体的。


4. 描述一下C#中索引器的实现过程,是否只能根据数字进行索引?
  <return type> this[type index]
  {
     get{…}
     set{…}
  }
  不是只能根据数字进行索引,可以用任意类型。


5. 用.net做B/S结构的系统,大多数用几层结构来开发,每一层之间的关系以及为什么要这样分层?
  一般为3层,数据访问层,业务层,表示层。
  数据访问层对数据库进行增删查改。
  业务层一般分为二层,业务表观层实现与表示层的沟通,业务规则层实现用户密码的安全等。
  表示层为了与用户交互例如用户添加表单。
  优点:分工明确,条理清晰,易于调试,而且具有可扩展性。
  缺点:增加成本。


6. 什么叫应用程序域?
  应用程序域为隔离正在运行的应用程序提供了一种灵活而安全的方法。
  应用程序域通常由运行库宿主创建和操作。
  应用程序域使应用程序以及应用程序的数据彼此分离,有助于提高安全性。
  下面的代码示例创建一个新的应用程序域,然后加载并执行以前生成的程序集 HelloWorld.exe。
  static void Main()
  {
      // Create an Application Domain:
      System.AppDomain newDomain = System.AppDomain.CreateDomain("NewApplicationDomain");

      // Load and execute an assembly:
      newDomain.ExecuteAssembly(@"c:\HelloWorld.exe");

      // Unload the application domain:
      System.AppDomain.Unload(newDomain);
  }


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


8. 什么是装箱和拆箱?
  装箱:从值类型转换到引用类型。
  拆箱:从引用类型转换到值类型。


9. 什么是受管制的代码?什么是非受管制的代码?
  在CLR虚拟机中运行的代码是受管制的代码;不经过CLR运行的代码是非受管制的代码。


10. 什么是强类型系统?
  运行时类型识别(RTTI)(Run-Time Type Information)


11. 什么是Code-Behind技术?
     代码分离技术;aspx,resx和cs三个后缀的文件,就是所谓的代码分离,它可以使你的程序显得更加有条理、可读性更强。实现了HTML代码和服务器代码分离.方便代码编写和整理。


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


13. 在C#中,String str = null 与 String str = “”的区别。 
  String str = null 不给分配内存空间,而String str = ""分配长度为空字符串的内存空间。


14. 请详述在.NET中类(class)与结构(struct)的异同?
  结构是值类型:值类型在栈上分配空间;
  类是引用类型:引用类型在堆栈上分配空间;
  虽然结构与类的类型不一样,可是他们的基类型都是对象(object),c#中所有类型的基类型都是object;
  虽然结构的初始化也使用了new 操作符,可是结构对象依然分配在栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对象不可用。
  结构:不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed;
  类:完全可扩展的,除非显示的声明sealed,否则类可以继承其他类和接口,自也能被继承虽然结构不能被继承,可是结构能够
  继承接口,方法和类继承接口一样;
  结构:
  没有默认的构造函数,但是可以添加构造函数
      Structs cannot contain explicit parameterless constructors
    没有析构函数
  没有 abstract 和 sealed(因为不能继承)
  不能有protected 修饰符
  可以不使用new 初始化
  在结构中初始化实例字段是错误的
      public struct myStruct
      {
          public Int32 i = 0;  //error
      }
  类:
  有默认的构造函数
  有析构函数
  可以使用 abstract 和 sealed
  有protected 修饰符
  必须使用new 初始化


15. 简要谈一下您对微软.NET 构架下remoting和webservice两项技术的理解以及实际中的应用。
WebService的特点是:
平台独立性(Platform-independent)、跨语言(只要能支持XML的语言都可以)以及穿透企业防火墙;webservice是基于http的是无状态的;
缺点:需要部署一台Web Server;而且速度比较慢;

net Remoting的特点是:
优点是用户既可以使用TCP信道进行二进制流方式通信,也可以使用HTTP信道进行SOAP格式的通信,效率相对WebService要高不少;remoting可以用于有状态的情况;
缺点:.net remoting只能应用于MS的.net framework之下。

使用场合:
如果互动双方都是支持.NET技术的环境,并且在操作系统上能提供一致的验证机制,而且很重视沟通双方作业的效率,就是.NET Remoting上场的时机。相反的,如果沟通双方是异质环境,又或沟通的模式就是无状态的情况,持续进行的互动作业前后是没有关联的,Web Service就是理想选择了。


16. 写出一条Sql语句:取出表A中第31到第40记录(SQLServer,以自动增长的ID作为主键,注意:ID可能不是连续的。
  解1: select top 10 * from A where id not in (select top 30 id from A) 
  解2: select top 10 * from A where id > (select max(id) from (select top 30 id from A )as A) 
  解3:select * from A where rownum <=10 and rowid not in (select rowid from A where rownum<=30 )


17. 面向对象的语言具有_____性、______性、_____性
  封装、继承、多态。


18. 能用foreach遍历访问的对象需要实现 ______接口或声明_____方法的类型。
  IEnumerable 、GetEnumerator。


19. GC是什么? 为什么要有GC?
  GC是垃圾收集器。程序员不用担心内存管理,因为垃圾收集器会自动进行管理。
  要请求垃圾收集,可以通过:System.GC.Collect(); 
  在C#中不能直接实现Finalize方法,而是在析构函数中调用基类的Finalize()方法


20. 接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
  接口可以继承接口;抽象类可以实现(implements)接口;抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。


21. 构造器Constructor是否可被override?
  构造器Constructor不能被继承,因此不能重写overrid,但可以被重载overload。


22. 是否可以继承String类?
  String类是密封(sealed)类,故不可以继承。


23. try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
  会执行,在return前执行。


24. 两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
  不对,有相同的hash code。

25. swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
  switch语句表达式的值必须为下列类型中的一种:sbyte、byte、short、ushort、int、uint、long、ulong、char、string。


26. 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
  不能,一个对象的一个synchronized方法只能由一个线程访问。


27. short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
  short s1 = 1; s1 = s1 + 1;有错,s1是short型,s1+1是int型,不能显式转化为short型。可修改为s1 =(short)(s1 + 1) 。
  short s1 = 1; s1 += 1正确。


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


29. 进程和线程的区别?
  进程是系统进行资源分配和调度的单位;
  线程是CPU调度和分派的单位,一个进程可以有多个线程,这些线程共享这个进程的资源。


30. 堆和栈的区别?
  栈:由编译器自动分配、释放。在函数体中定义的变量通常在栈上。
  堆:一般由程序员分配释放。用new、malloc等分配内存函数分配得到的就是在堆上。


31. ASP.NET与ASP相比,主要有哪些进步?
  asp解释型,aspx编译型,性能提高,有利于保护源码。


32. 请说明在.net中常用的几种页面间传递参数的方法,并说出他们的优缺点。
  session(viewstate)     简单,但易丢失
  application                全局
  cookie                      简单,但可能不支持,可能被伪造
  input type="hidden"  简单,可能被伪造
  url参数                     简单,显示于地址栏,长度有限
  数据库                      稳定,安全,但性能相对弱


33. 请指出GAC的含义?
  全称是Global Assembly Cache,全局程序集缓存。
  作用:可以存放一些有很多程序都要用到的公共集合,很多程序就可以从GAC里面取得Assembly,而不需要再把所有要用到的Assembly都拷贝到应用程序的执行目录下面。


34.DataReader与Dataset有什么区别?
  前者是只能向前的只读游标,后者是内存中的表。


35.软件开发过程一般有几个阶段?每个阶段的作用?
1)问题定义 
      问题定义阶段必须回答的关键问题:“要解决的问题是什么?”如果不知道问题是什么就试图解决这个问题,显然是盲目的,只会白白浪费时间和金钱,最终得出的结果很可能是毫无意义的。尽管确切地定义问题的必要性是十分明显的,但是在实践中它却可能是最容易被忽视的一个步骤。 
2)可行性研究 
      这个阶段要回答的关键问题:“对于上一个阶段所确定的问题有行得通的解决办法吗?”为了回答这个问题,系统分析员需要进行一次大大压缩和简化了的系统分析和设计的过程,也就是在较抽象的高层次上进行的分析和设计的过程。 
3)需求分析 
     这个阶段的任务仍然不是具体地解决问题,而是准确地确定“为了解决这个问题,目标系统必须做什么”,主要是确定目标系统必须具备哪些功能。 
4)总体设计 
      这个阶段必须回答的关键问题是:“概括地说,应该如何解决这个问题?” 
5)详细设计 
      总体设计阶段以比较抽象概括的方式提出了解决问题的办法。详细设计阶段的任务就是把解法具体化,也就是回答下面这个关键问题:“应该怎样具体地实现这个系统呢?” 
通常用HIPO图(层次图加输入/处理/输出图)或PDL语言(过程设计语言)描述详细设计的结果。 
6)编码和单元测试 
      这个阶段的关键任务是写出正确的容易理解、容易维护的程序模块。 
      程序员应该根据目标系统的性质和实际环境,选取一种适当的高级程序设计语言(必要时用汇编语言),把说细设计的结果翻译成用选定的语言书写的程序,并且仔细测试编写出的每一个模块。 
7)综合测试 
      这个阶段的关键任务是通过各种类型的测试(及相应的调试)使软件达到预定的要求。 
      最基本的测试是集成测试和验收测试。所谓集成测试是根据设计的软件结构,把经过单元测试检验的模块按某种选定的策略装配起来,在装配过程中对程序进行必要的测试。所谓验收测试则是按照规格说明书的规定(通常在需求分析阶段确定),由用户(或在用户积极参加下)对目标系统进行验收。 
必要时还可以再通过现场测试或平行运行等方法对目标系统进一步测试检验。 
为了使用户能够积极参加验收测试,并且在系统投入生产性运行以后能够正确有效地使用这个系统,通常需要以正式的或非正式的方式对用户进行培训。 
通过对软件测试结果的分析可以预测软件的可靠性;反之,根据对软件可靠性的要求也可以决定测试和调试过程什么时候可以结束。 
应该用正式的文档资料把测试计划、详细测试方案以及实际测试结果保存下来,做为软件配置的一个组成成分。 
8)软件维护 
      维护阶段的关键任务是,通过各种必要的维护活动使系统持久地满足用户的需要。 
通常有四类维护活动:改正性维护,也就是诊断和改正在使用过程中发现的软件错误;适应性维护,即修改软件以适应环境的变化;完善性维护,即根据用户的要求改进或扩充软件使它更完善;预防性维护,即修改软件为将来的维护活动预先做准备。


36. 在c#中using和new这两个关键字有什么意义,请写出你所知道的意义? 
  using 引入命名空间或者使用非托管资源
  new 新建实例或者隐藏父类方法


37. 什么叫做SQL注入,如何防止?请举例说明。
  利用sql关键字对网站进行攻击;过滤关键字等。


38. 列举一下你所了解的XML技术及其应用
  XML用于配置,用于保存静态数据类型.接触XML最多的是web Services和config。

 

39. 什么是SOAP,有哪些应用?
  SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息并执行远程过程调用的协议,是一个基于XML的协议。使用SOAP,不用考虑任何特定的传输协议(最常用的还是HTTP协议),可以允许任何类型的对象或代码,在任何平台上,以任何一直语言相互通信。这种相互通信采用的是XML格式的消息。
  SOAP也被称作XMLP,为两个程序交换信息提供了一种标准的工作机制。在各类机构之间通过电子方式相互协作的情况下完全有必要为此制定相应的标准。
  SOAP描述了把消息捆绑为XML的工作方式。它还说明了发送消息的发送方、消息的内容和地址以及发送消息的时间。
  SOAP是Web Service的基本通信协议。SOAP规范还定义了怎样用XML来描述程序数据(ProgramData),怎样执行RPC(Remote Procedure Call)。
  大多数SOAP解决方案都支持RPC-style应用程序。
  SOAP还支持 Document-style应用程序(SOAP消息只包含XML文本信息)。
  最后SOAP规范还定义了HTTP消息是怎样传输SOAP消息的。MSMQ、SMTP、TCP/IP都可以做SOAP的传输协议。
  SOAP 是一种轻量级协议,用于在分散型、分布式环境中交换结构化信息。 
  SOAP 利用 XML 技术定义一种可扩展的消息处理框架,它提供了一种可通过多种底层协议进行交换的消息结构。 这种框架的设计思想是要独立于任何一种特定的编程模型和其他特定实现的语义。

  SOAP 定义了一种方法以便将 XML 消息从 A 点传送到 B 点。 为此,它提供了一种基于 XML 且具有以下特性的消息处理框架: 
  (1) 可扩展 (2) 可通过多种底层网络协议使用 (3) 独立于编程模型。

 

40. C#中 property 与 attribute的区别,他们各有什么用处,这种机制的好处在哪里?
  一个是属性,用于存取类的字段;一个是特性,用来标识类,方法等的附加性质。property是类成员级的;attribute是类级的。


41. public static const int A=1;这段代码有错误么?是什么?
  const不能用static修饰。


42. 利用operator声明且仅声明了==,有什么错误么?
  要同时修改Equale和GetHash(),重载了"==" 就必须重载 "!="


43. 大概描述一下ASP.NET服务器控件的生命周期
(1)初始化  在此阶段中,主要完成两项工作:一、初始化在传入Web请求生命周期内所需的设置;二、跟踪视图状态。
(2)加载视图状态  此阶段的主要任务是检查服务器控件是否存在以及是否需要将其状态恢复到它在处理之前的请求结束的状态。
(3)处理回发数据
(4)加载  至此阶段开始,控件树中的服务器控件已创建并初始化、状态已还原并且窗体控件反映了客户端的数据。
(5)发送回发更改通知  在此阶段,服务器控件通过引发事件作为一种信号,表明由于回发而发生的控件状态变化(因此该阶段仅用于回发过程)。
(6)处理回发事件  该阶段处理引起回发的客户端事件。
(7)预呈现  该阶段完成在生成控件之前所需要的任何工作。
(8)保存状态
(9)呈现  表示向HTTP输出流中写入标记文本的过程。
(10)处置  在此阶段中,通过重写Dispose ()方法完成释放对昂贵资源的引用,如数据库链接等。
(11)卸载  完成的工作与"处置"阶段相同,但是,开发人员通常在Dispose()方法中执行清除,而不处理Unload事件。


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


45. <%# %> 和 <% %> 有什么区别?
  <%# %>表示绑定的数据源
  <% %>是服务器端代码块


46. protected internal 被访问范围是:同一程序集的所有类及所有程序集的子类。


47. COM是Component Object Model(组件对象模型)的缩写.
      COM组件是以WIN32动态链接库(DLL)或可执行文件(EXE)形式发布的可执行代码组成。
     COM+并不是COM的新版本,我们可以把它理解为COM的新发展,或者为COM更高层次上的应用。COM+不再局限于COM的组件技术,它更加注重于分布式网络应用的设计和实现,COM+紧紧地与操作系统结合起来,通过系统服务为应用程序提供全面的服务。


48. 静态变量和非静态变量的区别?
静态变量:
  静态变量使用 static 修饰符进行声明;
  在所属类被装载时创建;
  通过类进行访问;
  所属类的所有实例的同一静态变量都是同一个值;

非静态变量:
  不带有 static 修饰符声明的变量称做非静态变量;
  在类被实例化时创建;
  通过对象进行访问;
  同一个类的不同实例的同一非静态变量可以是不同的值。


49. const 和 static readonly 区别?
const
  用 const 修饰符声明的成员叫常量,是在编译期初始化并嵌入到客户端程序
static readonly
  用 static readonly 修饰符声明的成员依然是变量,只不过具有和常量类似的使用方法:通过类进行访问、初始化后不可以修改。但与常量不同的是这种变量是在运行时初始化。


50. extern 是什么意思?
      extern 修饰符用于声明由程序集外部实现的成员函数,经常用于系统API函数的调用(通过 DllImport )。注意,和DllImport一起使用时要加上 static 修饰符,
也可以用于对于同一程序集不同版本组件的调用(用 extern 声明别名),不能与 abstract 修饰符同时使用。
example:
        //注意DllImport是一个Attribute Property,在System.Runtime.InteropServices命名空间中定义
        //extern与DllImport一起使用时必须再加上一个static修饰符
        [DllImport("User32.dll")]
        public static extern int MessageBox(int Handle, string Message, string Caption, int Type);

51. abstract 是什么意思?
  abstract 修饰符可以用于类、方法、属性、事件和索引指示器(indexer),表示其为抽象成员;
  abstract 不可以和 static 、virtual 、override 一起使用;
  声明为abstract 成员可以不包括实现代码,但只有类中还有未实现的抽象成员,该类就不可以被实例化,通常用于强制继承类必须实现某一成员。

 

52. internal 修饰符起什么作用?
  internal 修饰符可以用于类型或成员,使用该修饰符声明的类型或成员只能在同一程序集内访问,接口的成员不能使用 internal 修饰符。


53. sealed 修饰符是干什么的?
  sealed 修饰符表示密封;
  用于类时,表示该类不能再被继承,不能和 abstract 同时使用,因为这两个修饰符在含义上互相排斥;
  用于方法和属性时,表示该方法或属性不能再被继承,必须和 override 关键字一起使用,因为使用 sealed 修饰符的方法或属性肯定是基类中相应的虚成员;
  通常用于实现第三方类库时不想被客户端继承,或用于没有必要再继承的类以防止滥用继承造成层次结构体系混乱;
  恰当的利用 sealed 修饰符也可以提高一定的运行效率,因为不用考虑继承类会重写该成员。

 

54. this 关键字的含义?
      this 是一个保留字,仅限于构造函数和方法成员中使用;
      在类的构造函数中出现表示对正在构造的对象本身的引用,在类的方法中出现表示对调用该方法的对象的引用,在结构的构造上函数中出现表示对正在构造的结构的引用,在结构的方法中出现表示对调用该方法的结果的引用;
      this 保留字不能用于静态成员的实现里,因为这时对象或结构并未实例化;
      在 C# 系统中,this 实际上是一个常量,所以不能使用 this++ 这样的运算;
      this 保留字一般用于限定同名的隐藏成员、将对象本身做为参数、声明索引访问器、判断传入参数的对象是否为本身。


55. 如果基类中的虚属性只有一个属性访问器,那么继承类重写该属性后可以有几个属性访问器?如果基类中有get 和set 两个呢?
     如果基类中的虚属性只有一个属性访问器,那么继承类重写该属性后也应只有一个。如果基类中有get 和set 两个属性访问器,那么继承类中可以只有一个也可以同时有两个属性访问器。


56. 接口可以包含哪些成员?
接口可以包含属性、方法、索引指示器和事件,但不能包含常量、域、操作符、构造函数和析构函数,而且也不能包含任何静态成员。


57. 接口的多继承会带来哪些问题?
C# 中的接口与类不同,可以使用多继承,即一个子接口可以有多个父接口。但如果两个父成员具有同名的成员,就产生了二义性(这也正是 C# 中类取消了多继承的原因之一),这时在实现时最好使用显式的声明。


58. 抽象类和接口的区别?
抽象类(abstract class)可以包含功能定义和实现,接口(interface)只能包含功能定义;
抽象类是从一系列相关对象中抽象出来的概念,因此反映的是事物的内部共性;
接口是为了满足外部调用而定义的一个功能约定, 因此反映的是事物的外部特性。


59. 如何释放非托管资源?
     .NET 平台在内存管理方面提供了GC(Garbage Collection),负责自动释放托管资源和内存回收的工作,但它无法对非托管资源进行释放,这时我们必须自己提供方法来释放对象内分配的非托管资源,比如你在对象的实现代码中使用了一个COM对象最简单的办法,可以通过实现protected void Finalize()(析构函数会在编译时变成这个方法)来释放非托管资源,因为GC在释放对象时会检查该对象是否实现了 Finalize() 方法,如果是则调用它。但是这种方法会降低效率。
     有一种更好的方法,那就是通过实现一个接口显式的提供给客户调用端手工释放对象的方法,而不是等着GC来释放我们的对象(何况效率又那么低)System 命名空间内有一个 IDisposable 接口,拿来做这事非常合适,就省得我们自己再声明一个接口了。
      另外补充一句,这种实现并不一定要使用了非托管资源后才用,如果你设计的类会在运行时有大些的实例,为了优化程序性能,你也可以通过实现该接口让客户调用端在确认不需要这些对象时手工释放它们。


60. P/Invoke是什么?
      在受控代码与非受控代码进行交互时会产生一个事务(transaction) ,这通常发生在使用平台调用服务(Platform Invocation Services),即P/Invoke。如调用系统的 API 或与 COM 对象打交道,通过 System.Runtime.InteropServices 命名空间。
      虽然使用 Interop 非常方便,但据估计每次调用事务都要执行 10 到 40 条指令,算起来开销也不少,所以我们要尽量少调用事务。如果非用不可,建议本着一次调用执行多个动作,而不是多次调用每次只执行少量动作的原则。

 

61. StringBuilder 和 String 的区别?
      String 虽然是一个引用类型,但在赋值操作时会产生一个新的对象,而 StringBuilder 则不会;所以在大量字符串拼接或频繁对某一字符串进行操作时最好使用StringBuilder,不要使用 String。


62. explicit 和 implicit 的含义?
  explicit 和 implicit 属于转换运算符,如用这两者可以让我们自定义的类型支持相互交换。
  explicti 表示显式转换,如从 A -> B 必须进行强制类型转换(B = (B)A)。
  implicit 表示隐式转换,如从 B -> A 只需直接赋值(A = B)。
  隐式转换可以让我们的代码看上去更漂亮、更简洁易懂,所以最好多使用 implicit 运算符。
  不过!如果对象本身在转换时会损失一些信息(如精度),那么我们只能使用 explicit 运算符,以便在编译期就能警告客户调用端。

 

63. params 有什么用?
  params 关键字在方法成员的参数列表中使用,为该方法提供了参数个数可变的能力,它在参数列表只能出现一次并且不能在其后再有参数定义。

 

64. 什么是反射?
  反射,Reflection,通过它我们可以在运行时获得各种信息,如程序集、模块、类型、字段、属性、方法和事件。通过对类型动态实例化后,还可以对其执行操作。

 

65. abstract class和interface有什么区别?
  声明方法的存在而不去实现它的类被叫做抽像类(abstract class)
  它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。
  不能创建abstract 类的实例。
  然而可以创建一个变量,其类型是一个抽像类,并让它指向具体子类的一个实例。
  不能有抽像构造函数或抽像静态方法。
  Abstract 类的子类为它们父类中的所有抽像方法提供实现,否则它们也是抽像类。
  取而代之,在子类中实现该方法。
  知道其行为的其它类可以在类中实现这些方法。

  接口(interface)是抽像类的变体。
  在接口中,所有方法都是抽像的。
  多继承性可通过实现这样的接口而获得。
  接口中的所有方法都是抽像的,没有一个有程序体。
  接口只可以定义static final成员变量。
  接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。
  当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。
  然后,它可以在实现了该接口的类的任何对像上调用接口的方法。
  由于有抽像类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。
  引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。
  接口可以继承接口。
  抽像类可以实现(implements)接口
  抽像类是否可继承实体类(concrete class),但前提是实体类必须有明确的构造函数。

 

66. .net Remoting 的工作原理是什么?
      服务器端向客户端发送一个进程编号,一个程序域编号,以确定对象的位置。
      什么是Remoting,简而言之,我们可以将其看作是一种分布式处理方式。从微软的产品角度来看,可以说Remoting就是DCOM的一种升级,它改善了很多功能,并极好的融合到.Net平台下。Microsoft .NET Remoting 提供了一种允许对象通过应用程序域与另一对象进行交互的框架。这也正是我们使用Remoting的原因。为什么呢?在Windows操作系统中,是将应用程序分离为单独的进程。这个进程形成了应用程序代码和数据周围的一道边界。如果不采用进程间通信(RPC)机
制,则在一个进程中执行的代码就不能访问另一进程。这是一种操作系统对应用程序的保护机制。然而在某些情况下,我们需要跨过应用程序域,与另外的应用程序域进行通信,即穿越边界。


67. ASP.net的身份验证方式有哪些?
1)Windows 身份验证提供程序
     提供有关如何将 Windows 身份验证与 Microsoft Internet 信息服务 (IIS) 身份验证结合使用来确保 ASP.NET 应用程序安全的信息。
2)Forms 身份验证提供程序
     提供有关如何使用您自己的代码创建应用程序特定的登录窗体并执行身份验证的信息。使用 Forms 身份验证的一种简便方法是使用 ASP.NET 成员资格和 ASP.NET 登录控件。它们一起提供了一种只需少量或无需代码就可以收集、验证和管理用户凭据的方法。
3)Passport 身份验证提供程序
     提供有关由 Microsoft 提供的集中身份验证服务的信息,该服务为成员站点提供单一登录和核心配置。


68. 活动目录的作用
  Active Directory存储了有关网络对象的信息,并且让管理员和用户能够轻松地查找和使用这些信息。
  Active Directory使用了一种结构化的数据存储方式,并以此作为基础对目录信息进行合乎逻辑的分层组织。


69. 如何理解.net中的垃圾回收机制?
  .NET Framework 的垃圾回收器管理应用程序的内存分配和释放。
  每次您使用 new 运算符创建对象时,运行库都从托管堆为该对象分配内存。
  只要托管堆中有地址空间可用,运行库就会继续为新对象分配空间。
  但是,内存不是无限大的。最终,垃圾回收器必须执行回收以释放一些内存。
  垃圾回收器优化引擎根据正在进行的分配情况确定执行回收的最佳时间。
  当垃圾回收器执行回收时,它检查托管堆中不再被应用程序使用的对象并执行必要的操作来回收它们占用的内存。

 

70. final, finally, finalize的区别。
  final:修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。
  因此 一个类不能既被声明为 abstract的,又被声明为final的。
  将变量或方法声明为final,可以保证它们在使用中不被改变。
  被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。
  被声明为 final的方法也同样只能使用,不能重载
  finally:在异常处理时提供 finally 块来执行任何清除操作。
  如果抛出一个异常,那么相匹配的 catch 子句就会执行.
  然后控制就会进入 finally 块(如果有的话)。
  finalize:方法名。
  这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。
  它是在 Object 类中定义的 ,因此所有的类都继承了它。
  子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。
  finalize() 方法是在垃圾收集器删除对像之前对这个对象调用的。

 

71. UDP连接和TCP连接的异同
      TCP  传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,
之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。 
      UDP  用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,
但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输
速度很快。


72. String str=new String("a")和String str = "a"有什么区别? 
  String str = "a"; 这个只是一个引用,内存中如果有“a"的话,str就指向它;如果没有,才创建它;
  如果你以后还用到"a"这个字符串的话并且是这样用:
  String str1 = "a"; String str2 = "a"; String str2 = "a"; 这4个变量都共享一个字符串"a"。
  而String str = new String("a");是根据"a"这个String对象再次构造一个String对象,将新构造出来的String对象的引用赋给str。


73. 请问进程调度中产生死锁的必要条件是什么?解决死锁有几种办法
产生死锁的四个必要条件: 
(1)互斥条件:一个资源每次只能被一个进程使用。
(2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3)不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

死锁排除的方法:
(1)撤消陷于死锁的全部进程;
(2)逐个撤消陷于死锁的进程,直到死锁不存在;
(3)从陷于死锁的进程中逐个强迫放弃所占用的资源,直至死锁消失。
(4)从另外一些进程那里强行剥夺足够数量的资源分配给死锁进程,以解除死锁状态。


74.  解释一下UDDI、WSDL的意义及其作用
      UDDI是统一描述集成协议,是一套基于Web的,分布式的,为WEB服务提供的信息注册的实现标准规范,同时为也是为企业本身提供的Web服务注册以让别的企业能够发现并访问的协议标准。提供了基于标准的规范,用于描述和发现服务,还提供了一组基于因特网的实现。
      WSDL这是一个基于XML的描述WEB服务的接口。

 

75. DOM优点和缺点

      Document Object Model,文档对象模型。

      DOM的优势主要表现在:易用性强,使用DOM时,将把所有的XML文档信息都存于内存中,并且遍历简单,支持XPath,增强了易用性。

  DOM的缺点主要表现在:效率低,解析速度慢,内存占用量过高,对于大文件来说几乎不可能使用。另外效率低还表现在大量的消耗时间,因为使用DOM进行解析时,将为文档的每个element、attribute、processing-instrUCtion和comment都创建一个对象,这样在DOM机制中所运用的大量对象的创建和销毁无疑会影响其效率。

posted @ 2016-12-05 17:10  孫志峰  阅读(278)  评论(0编辑  收藏  举报