c#.net学习基础面试通关.doc_第1页
c#.net学习基础面试通关.doc_第2页
c#.net学习基础面试通关.doc_第3页
c#.net学习基础面试通关.doc_第4页
c#.net学习基础面试通关.doc_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

如何将该类标记为可序列化? 类标记为Serializable NonSerialized 不被序列化的字段实例化三方法 :Class1 cs = new Class1() ; FileStream fs = File.Create(“文件名”) ; 反射1. new 关键字用法(1)new 运算符 用于创建对象和调用构造函数。(2)new 修饰符 用于向基类成员隐藏继承成员。(3)new 约 束 用于在泛型声明中约束可能用作类型参数的参数的类型。1.DateTime.Parse(myString); 这行代码有什么问题? 如果myString不能转换为DateTime则,抛出异常。2.PDB是什么东西? 在调试中它应该放在哪里? 调试符号文件 当您指定 /debug(发出调试信息)(C# 编译器选项)时,编译器将在创建输出文件(.exe 或 .dll)的同一目录下创建一个与输出文件同名的 .pdb 文件。4.写一个标准的lock(),在访问变量的前后创建临界区,要有双重检查, public void LockTest() Object lockObj = new Object(); lock (lockObj) / 10.对比OOP和SOA,它们的目的分别是什么? OOP(面向对象程序设计)是一种编程模型,强调将复杂的逻辑分解出小的模块,特性是继承,封装和多态 。SOA(面向服务的体系结构)的思想是将业务逻辑封装成服务或者中间件提供给应用程序来调用,当然其组件化思想是继承和发扬了OO的优点。11.XmlSerializer是如何工作的?使用这个类的进程需要什么ACL权限? XmlSerializer是将对象的属性和字段进行序列化和反序列化的,序列化成为xml数据,反序列化再将xml转换成对象。应该至少需要ACL权限中的读权限. 23.XmlSerializer使用的针对属性的模式有什么好处?解决了什么问题? 只序列化有用的数据,而不是序列化整个对象。实现没必要的数据冗余,和提升序列化时的性能。12.为什么不提倡catch(Exception)? 捕捉特定类型的异常 1、将捕获系统所有的异常,不明确,异常太多 2、出现异常的时候影响性能 3、catch子句为空则表示放行所有异常,威胁系统安全稳定。 Try catch 在执行完catch子句后程序将继续执行,除非包含 return,exit,throw 13.Debug.Write和Trace.Write有什么不同?何时应该使用哪一个? Debug.Write是调试的时候向跟踪窗口输出信息。当编译模式为debug的时候才有效,为release的时候Debug.Write在编译的时候会忽略,而Trace则是在debug和release两种模式下均可以向跟踪窗口输出信息。14.Debug Build和Release Build的区别,是否会有明显的速度变化?请说明理由。 Debug调试版 包含用户调试时设置的断点信息以及调试信息,用全部符号调试信息编译,不进行优化; Release发行版 被完全优化,不包含任何符号调试信息。堆和栈的区别栈:由编译器自动分配、释放。在函数体中定义的变量通常在栈上。堆:一般由程序员分配释放。用new、malloc等分配内存函数分配得到的就是在堆上。栈是系统提供的功能,特点是快速高效,缺点是有限制,数据不灵活;而堆是函数库提供的功能,特点是灵活方便,数据适应面广泛,但是效率有一定降低。栈是系统数据结构,对于进程/线程是唯一的;堆是函数库内部数据结构,不一定唯一。不同堆分配的内存无法互相操作。栈空间分静态分配和动态分配两种。静态分配是编译器完成的,比如自动变量(auto)的分配。动态分配由alloca函数完成。栈的动态分配无需释放(是自动的),也就没有释放函数。为可移植的程序起见,栈的动态分配操作是不被鼓励的!堆空间的分配总是动态的,虽然程序结束时所有的数据空间都会被释放回系统,但是精确的申请内存/释放内存匹配是良好程序的基本要素。17.a.Equals(b)和a = b一样吗? a.Equals(b)表示a与b一致, a=b表示a与b的值相等 Equals对象间的比较 存在拆箱和装箱; =更灵活 遇见值类型 比值;遇见string 比字符串的值;遇见引用类型 比引用的对象。18.在对象比较中,对象一致和对象相等分别是指什么? 对象一致是指两个对象是同一个对象,引用相同。而对象相等是指两个对象的值相同,但引用不一定相同19.在.NET中如何实现深拷贝(deep copy)? C#中有两种类型变量,一种是值类型变量,一种是引用类型变量。对于前者,copy是属于全盘复制;而对于后者,一般的copy只是浅copy,相当于只传递一个引用指针一样。因此对于后者进行真正copy的时候,也是最费事的,具体的说,必须为其实现ICloneable接口中提供的Clone方法。 浅拷贝(影子克隆):只复制对象的基本类型,对象类型,仍属于原来的引用. 深拷贝(深度克隆):不紧复制对象的基本类,同时也复制原对象中的对象.就是说完全是新对象产生的. 浅拷贝和深拷贝之间的区别:浅拷贝是指将对象中的数值类型的字段拷贝到新的对象中,而对象中的引用型字段则指复制它的一个引用到目标对象。如果改变目标对象中引用型字段的值他将反映在原是对象中,也就是说原始对象中对应的字段也会发生变化。深拷贝与浅拷贝不同的是对于引用的处理,深拷贝将会在新对象中创建一个新的和原是对象中对应字段相同(内容相同)的字段,也就是说这个引用和原是对象的引用是不同的,我们在改变新对象中的这个字段的时候是不会影响到原始对象中对应字段的内容。所以对于原型模式也有不同的两种处理方法:对象的浅拷贝和深拷贝。 /浅拷贝 public object Clone() return this.MemberwiseClone(); /深拷贝 public object DeepClone() Person newP = new Person(); newP.PName = this._PName; newP.pSex = this.pSex ; return newP; 1、ReferenceEquals()比较是否是相同的对象实例 reference,声明如下: public static bool ReferenceEquals(object objA,object objB);特殊情况:objA、objB均为NULL时,为true 注意:该方法如作用与System.ValueType型(值类型),一律返回false:值类型需进行boxing(装箱)操作,则reference不一样了 2、=默认也是reference的,但很多对象给操作符重写了,进行的是value比较,System.ValueType均如此,部分class也重写了,典型的如System.String 3、Equals()则相当复杂,两种定义: public virtual bool Equals(object);public static bool Equals(object, object);virtual方法的Equals默认的是reference的比较,但.NET Framework中的大部分类都重写了该方法,所以需要具体类型对待。static方法的Equals则有点区别,其判别方式如下:i) 先A、B两对象是否同一instance,是-true. ii)A、B是否为NULL,是-true. iii) 前两者均不是true,返回调用virtual的Equals()方法的结果.这里需要注意的即virtual的Equals()方法大都被重写了,所以返回的结果需要依赖于各自类型的实现.20.请解释一下IClonable ICloneable 接口包含一个成员 Clone 支持克隆24.为什么不应该在.NET中使用out参数?它究竟好不好? .NET中CLR同视ref和out,但c#不同对待,区别就是谁负责初始化引用对象.这样就不容易控制方法参数。out 关键字会导致参数通过引用来传递。与ref关键字类似,不同之处在于ref要求变量必须在传递之前进行初始化。若要使用out参数,方法定义和调用方法都必须显式使用out关键字。out参数传递的变量不需要在传递之前进行初始化,但需调用方法以便在方法返回之前赋值。ref和out关键字在运行时的处理方式不同,但在编译时的处理方式相同。因此,如果一个方法采用ref参数,而另一个方法采用out参数,则无法重载这两个方法。但是,如果一个方法采用ref或out参数,而另一个方法不采用这两类参数,则可以进行重载。当希望方法返回多个值时,声明out方法很有用。25.特性能够放到某个方法的参数上?如果可以,这有什么用? 委托26.新建包含DataGrid控件的ASP.NET页,DataGrid控件负责显示检索到的数据并可按升降排序,我们通过 SortOrder 属性来给DataGrid控件提供数据排序方式:升序时SortOrder 的值为ASC,降序时SortOrder 的值为DESC。如果用户选择降序,应该执行 ca)Application“SortOrder” = “DESC”;string val = (string) Application“SortOrder”;b)Cache“SortOrder” = “DESC”;string val = (string) Cache“SortOrder”;c)ViewState“SortOrder” = “DESC”;string SortOrder = (string) ViewState“SortOrder”;d)Cache“SortOrder” = “SortOrder”;string val = (string) Cache“DESC”;27.public static void Main(string args) int i = 2000;object o = i; i = 2001; int j =(int) o; Console.WriteLine(i=0,o=1, j=2,i,o,j); 请问此程序的输出是什么,为什么 i=2001,o=2000,j=200028.class Class1 public static int Count = 0; static Class1() / 加1 静态构造 在程序执行前对 用于对静态数据初始化 只执行一次 Count+; public Class1() Count+; static void Main() Class1 o1 = new Class1(); /加1 Class1 o2 = new Class1(); /再加1 Console.WriteLine(Class1.Count); Console.Read(); 输出什么?3 29.以下语句执行后myTable的名称是什么?。 空System.Data.DataTable myTable= new System.Data.DataTable();30.如下的 IDimensions 接口和Box 类,该类显式实现接口成员 Length 和 Width。myDimensions是IDimensions 接口的一个实例。interface IDimensions float Length(); float Width();class Box : IDimensions float lengthInches; float widthInches; public Box(float length, float width) lengthInches = length; widthInches = width; float IDimensions.Length() return lengthInches; float IDimensions.Width() return widthInches; public static void Main() Box myBox = new Box(30.0f, 20.0f); IDimensions myDimensions = (IDimensions) myBox; System.Console.WriteLine(Length: 0, myDimensions.Length(); System.Console.WriteLine(Width: 0, myDimensions.Width(); const和readonly有什么区别?const字段只能在该字段的声明中初始化,只能用内建的类型。readonly字段可以在声明或构造函数中初始化,可以修饰任何类型包括引用类型。因此,根据所使用的构造函数,readonly字段可能具有不同的值。另外,const字段为编译时常数,而readonly字段可用于运行时常数System.String和System.StringBuilder有什么区别?String对象是不可改变的。每次使用System.String类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,与创建新的String对象相关的系统开销可能会非常昂贵。虽然StringBuilder对象是动态对象,允许扩充它所封装的字符串中字符的数量,但是您可以为它可容纳的最大字符数指定一个值。此值称为该对象的容量,不应将它与当前StringBuilder对象容纳的字符串长度混淆在一起。例如,可以创建StringBuilder类的带有字符串“Hello”(长度为5)的一个新实例,同时可以指定该对象的最大容量为25。当修改StringBuilder时,在达到容量之前,它不会为其自己重新分配空间。当达到容量时,将自动分配新的空间且容量翻倍。6.解释一下UDDI、WSDL的意义及其作用。WSDL(网络服务描述语言,Web Services Description Language)是一门基于 XML 的语言,用于描述 Web Services 以及如何对它们进行访问。UDDI 是一种目录服务,企业可以使用它对 Web services 进行注册和搜索。UDDI 是一种由 WSDL 描述的 web services 界面的目录。UDDI 是一个独立于平台的框架,用于通过使用 Internet 来描述服务,发现企业,并对企业服务进行集成。Webservice安全性:加密签名 身份信息 证书 7.常用的调用webservice方法有哪些? get post soapXML Web服务可以使用URL、HTTP和XML进行访问1、直接引用含有webservice解决方案的dll。2、添加web引用3、在Internet上调用4、利用三SOAP调用 webservice可以支持事务 缓存 维持状态 WebMethod (Description=描述,EnableSession=true,CacheDuration=60,BufferResponse=false,MessageName=用于为方法或属性名创建别名, TransactionOption= TransactionOption.Supported/NotSupported/Disabled/Required/RequiresNew,)为了将会话状态存储在 ASP.NET HttpSessionState 对象中,XML Web services 必须继承自 WebService 和应用于 XML Web services 方法的 WebMethodAttribute(将 EnableSession 属性 (Property) 设置为 true)。如果 XML Web services 方法不需要会话状态,则禁用它即可提高性能。MessageName 属性可用于为方法或属性名创建别名。MessageName 属性 (Property) 最常用来唯一标识多态方法。默认情况下,MessageName 设置为 XML Web services 方法的名称。因此,如果 XML Web services 包含两个或更多同名的 XML Web services 方法,则可唯一确定各个 XML Web services 方法,处理方法是将 MessageName 设置为 XML Web services 内的唯一名称,而不用在代码中更改实际方法的名称。如果将 BufferResponse 设置为 true,就会将 XML Web services 方法的响应序列化到内存缓冲区中,直到该响应被完全序列化或缓冲区已满为止。一旦完成对响应的缓冲处理,该响应就通过网络返回到 XML Web services 客户端。当 BufferResponse 为 false 时,对 XML Web services 方法的响应在被序列化的同时被发回客户端。通常情况下,只有当已知 XML Web services 方法将大量数据返回到客户端时,才需要将 BufferResponse 设置为 false。对于少量数据,将 BufferResponse 设置为 true 可提高 XML Web services 的性能。当 BufferResponse 为 false 时,将对 XML Web services 方法禁用 SOAP 扩展名。8.webservice,在.netframework中,怎么结合xml?应用程序与webservice通信的方式是以XML数据的方法进行传输的。9.C#可否直接操作内存?若能,如何操作;若不能,为什么? 可以,通过unsafe语法,C#可以使用类似于C+的指针,直接操作内存。10.描述一下C#中索引器的实现过程,是否只能根据数字进行索引?要声明类或结构上的索引器,请使用 this 关键字,public int thisint index 索引器的签名由其形参的数量和类型组成。它不包括索引器类型或形参名。如果在同一类中声明一个以上的索引器,则它们必须具有不同的签名。 要为索引器提供一个其他语言可以使用的名字,请使用声明中的 name 属性。C# 并不将索引类型限制为整数。例如,对索引器使用字符串可能是有用的。通过搜索集合内的字符串并返回相应的值,可以实现此类的索引器。由于访问器可被重载,字符串和整数版本可以共存。class DayCollection string days = Sun, Mon, Tues, Wed, Thurs, Fri, Sat ; private int GetDay(string testDay) int i = 0; foreach (string day in days) if (day = testDay) return i; i+; return -1; public int thisstring day get return (GetDay(day); class Program static void Main(string args) DayCollection week = new DayCollection(); System.Console.WriteLine(weekFri); System.Console.WriteLine(weekMade-up Day); 18.请叙述属性与索引器的区别。属性 索引器 通过名称标识。通过签名标识。 通过简单名称或成员访问来访问。通过元素访问来访问。 可以为静态成员或实例成员。必须为实例成员。 属性的get访问器没有参数。索引器的ge访问器具有与索引器相同的形参表。 属性的set访问器包含隐式value参数。除了value参数外,索引器的set访问器还具有与索引器相同的形参表。安全权限控制 最基本的是在商务逻辑层进行控制。Override(覆写)Overload(重载)存在位置继承关系的类同一类中方 法 名相同相同参数列表相同必须不同返 回 值相同可以不相同1.面向对象的思想主要包括什么?面向对象特征: 唯一,抽象,封套,继承,多态。将要解决问题抽象为对象去解决它。面向对象和基于对象的区别面向对象的三大特点(封装,继承,多态)缺一不可。通常“基于对象”是使用对象,但是无法利用现有的对象模板产生新的对象类型,继而产生新的对象,也就是说“基于对象”没有继承的特点。而“多态”表示为父类类型的子类对象实例,没有了继承的概念也就无从谈论“多态”。现在的很多流行技术都是基于对象的,它们使用一些封装好的对象,调用对象的方法,设置对象的属性。但是它们无法让程序员派生新对象类型。他们只能使用现有对象的方法和属性。所以当你判断一个新的技术是否是面向对象的时候,通常可以使用后两个特性来加以判断。“面向对象”和“基于对象”都实现了“封装”的概念,但是面向对象实现了“继承和多态”,而“基于对象”没有实现这些,OO思想:面向对象是一种思想,是考虑事情的方法,通常表现为我们是将问题的解决按照过程方式来解决呢,还是将问题抽象为一个对象来解决它。2.什么是ASP.net中的用户控件因为新手还是分不清楚用户控件和服务器控件(也称自定义控件).用户控件一般用在内容多为静态,或者少许会改变的情况下.用的比较大.类似ASP中的include.但是功能要强大的多.如果现有的ASP.NET服务器控件都不符合应用程序的特定要求,则可以创建封装所需功能的Web用户控件或Web自定义控件。这两种控件之间的主要区别在于设计时的易创建性与易用性。Web用户控件Web自定义控件难于创建易于创建为使用可视化设计工具的使用者提供有限的支持为使用者提供完全的可视化设计工具支持每个应用程序中需要控件的一个单独副本仅在全局程序集缓存中需要控件的单个副本运行时动态编译,不能添加到Visual Studio中的工具箱可以添加到Visual Studio中的工具箱适用于静态布局适用于动态布局3. 泛型?什么叫应用程序域?什么是受管制的代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?泛型,2.0版C#语言和公共语言运行库 (CLR) 中的一个新功能。泛型将类型参数的概念引入 .NET Framework,类型参数使得设计如下类和方法成为可能:这些类和方法将一个或多个类型的指定推迟到客户端代码声明并实例化该类或方法的时候。例如,通过使用泛型类型参数T,您可以编写其他客户端代码能够使用的单个类,而不致引入运行时强制转换或装箱操作的成本或风险。弱类型,即一个变量不必声明其类型,一个被用于表示字符串的变量在后面的程序中也可用来表示数字; 强类型,意味着必须事先声明变量,并且该变量只可用于表示一种类型的数据(例如或者一个整数或者一个字符串)。装箱,将值类型转换为引用类型,原值类型失去性能优势。拆箱,将引用类型转换为值类型装箱过程:1.从托管堆中分配内存。大小为值类型的各字段大小+同步块+方法表指针2.值类型的字段复制到新分配的内存里。3.返回对象地址,即 对象的引用。创建一个object实例并将这个值复制给这个object,装箱后的object对象中的数据位于堆中,堆中的地址在栈中。被装箱的类型的值是作为一个拷贝赋给对象的。拆箱过程1.检查装箱引用.2.根据显示转换声明的类型检查装箱对象类型3.将值从实例复制到值类型变量中首先,检查这个对象实例,看它是否为给定的值类型的装箱值。然后,把这个实例的值拷贝给值类型的变量。利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的值相互转换,将值类型与引用类型链接起来int val = 100; object obj = val; int num = (int) obj; Console.WriteLine (num: 0, num); 将值类型转换为引用类型,再由引用类型转换为值类型的过程CTS: 通用类型系统.主要是为了语言之间的进行标准化处理.CLS:公共语言规范. CLS 通过定义一组开发人员可以确信在多种语言中都可用的功能来增强和确保语言互用性。 CLR:Common Language Runtime公共语言运行库和Java虚拟机一样也是一个运行时环境,它负责资源管理(内存分配和垃圾收集),并保证应用和底层操作系统之间必要的分离。在CLR中运行的代码称为托管代码。SQLServer2005集成了Microsoft Windows的.NETFramework的公共语言运行库(CLR)组件。这意味着您现在可以使用任意.NETFramework语言(包括VB.NET和C#)编写存储过程、触发器、用户定义类型、用户定义函数、用户定义聚合函数以及流处理表值函数。Microsoft.SqlServer.Server命名空间包含一组新的应用程序编程接口(API),使托管代码可以与Microsoft SQLServer环境交互。CLR函数适合于执行大量计算的应用程序,而不是执行简单Transact-SQL语句的应用程序。托管代码可以在客户端计算机上运行,而Transact-SQL不能。对于几乎或根本不需要过程逻辑的数据访问,请使用Transact-SQL。对于具有复杂逻辑的CPU密集型函数和过程,或要使用.NETFramework的基类库(BCL),请使用托管代码。5.值类型和引用类型的区别?写出C#的样例代码。值类型和引用类型的主要区别在于底层实现方式的不同。在把数据赋给值类型和引用类型的时候,两者表现完全不同:在把数据赋给一个值类型时,数据存储在堆栈上的变量中。在把数据赋给一个引用类型时,变量中只存储一个引用,数据则存储在托管堆上。堆栈是一个比较小的内存区域,进程和线程在其中存储大小固定的数据块。例如,无论数据的实际值是多少,存储整数和小数类型所需要的字节数都不会变化。因此这种变量在堆栈中的位置可以高效地确定(当一个过程需要提取某个变量时,就必须搜索堆栈。如果堆栈包含的变量具有动态的内存大小,这种搜索就需要较长的时间)。引用类型没有固定的大小。它们包含的数据更适合存储在堆上,而不是堆栈上,但是,引用类型的地址(即数据在堆上的位置)有固定的大小,所以可以存储在堆栈上。把引用存储在堆栈上,整个程序的运行速度会快得多,因为进程可以快速定位与变量中的数据。值类型和引用类型之间的差异不仅仅是在复制时它们的表现不同。数据成员可以分静态变量、非静态变量两种静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态的成员.因为静态成员存在于内存,所以非静态成员可以直接访问类中静态的成员.非静态成员:所有没有加Static的成员都是非静态成员,当类被实例化之后,可以通过实例化的类名进行访问.非静态成员的生存期决定于该类的生存期.而静态成员则不存在生存期的概念,因为静态成员始终驻留在内容中,方法与方法之间传递共享数据,但是不要大量使用,尤其内存紧张6.ADO.net中常用的对象有哪些?Connection数据库连接对象Command数据库命令DataReader数据读取器DataSet数据集7.如何理解委托?为什么要使用委托:a.更加灵活的调用方法; b.用于异步回调; c.在多线程中指定启动一个线程时调用的方法; d.事件模型中指定处理给定事件的方法。委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数和返回值委托具有以下特点: 委托类似于 C+ 函数指针,但它是类型安全的。 委托允许将方法作为参数进行传递。 委托可用于定义回调方法。 委托可以链接在一起;例如,可以对一个事件调用多个方法。 方法不需要与委托签名精确匹配。 C# 2.0 版引入了匿名方法的概念,此类方法允许将代码块作为参数传递,以代替单独定义的方法。this.Load+=new System.EventHandler(this.Page_Load);这个就是使用了一个委托.实例化委托的两种方法:匿名方法 命名方法在早期版本的 C# 中,命名方法是对委托进行实例化的唯一方式。1.命名方法 class Class1 delegate void print(string msg); static void showmsg(string msg) Console.WriteLine(hello, + msg); Console.ReadKey(); static void Main(string args) print p = showmsg; p(aaa); 2.匿名方法 class Class1 delegate void print(string msg); static void Main(string args) print p = delegate(string msg) Console.WriteLine(hello, + msg); Console.ReadKey(); ; p(aaa); C# 2.0 允许您对委托进行实例化,并立即指定委托将在被调用时处理的代码块,这些被称为匿名方法。将代码块传递为委托参数。匿名方法的签名不能使用Attributes和params array,可以用数组实现支持可变参数。匿名方法不能访问外部范围的 ref 或 out 参数。8.委托和接口的比较委托和接口都允许类设计器分离类型声明和实现。给定的接口可由任何类或结构继承和实现;可以为任何类中的方法创建委托,前提是该方法符合委托的方法签名。接口引用或委托可由不了解实现该接口或委托方法的类的对象使用。既然存在这些相似性,那么类设计器何时应使用委托,何时又该使用接口呢?在以下情况中使用委托: 当使用事件设计模式时。 当封装静态方法可取时。 当调用方不需要访问实现该方法的对象中的其他属性、方法或接口时。 需要方便的组合。 当类可能需要该方法的多个实现时。在以下情况中使用接口: 当存在一组可能被调用的相关方法时。 当类只需要方法的单个实现时。 当使用接口的类想要将该接口强制转换为其他接口或类类型时。 当正在实现的方法链接到类的类型或标识时:例如比较方法。使用单一方法接口而不使用委托的一个很好的示例是 IComparable 或 IComparable。IComparable 声明 CompareTo 方法,该方法返回一个整数,以指定相同类型的两个对象之间的小于、等于或大于关系。IComparable 可用作排序算法的基础,虽然将委托比较方法用作排序算法的基础是有效的,但是并不理想。因为进行比较的能力属于类,而比较算法不会在运行时改变,所以单一方法接口是理想的。8.C#中的接口和类有什么异同。接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员。不能直接实例化接口。接口可以包含事件、索引器、方法和属性。接口不能包含字段。接口不包含方法的实现。类和结构可从多个接口继承。接口自身可从多个接口继承。类可以继承多个接口,但只能继承一个类!接口成员一定是公共的。类或结构可继承多个接口。当类或结构继承接口时,它继承成员定义但不继承实现。20.请叙述类与结构的区别。1)、结构是值类型;2)、结构不支持继承;3)、结构不能定义默认的构造函数;4)、结构不能定义析构函数;5)、结构不能使用初始值设置域值。什么是抽象类(abstract class)?抽象类不能实例化。抽象类可以包含抽象方法和抽象访问器。不能用 sealed(C# 参考)修饰符修改抽象类,这意味着抽象类不能被继承(即,断子绝孙)。从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实实现。抽象方法具有以下特性:抽象方法是无实现体的虚方法。只允许在抽象类中使用抽象方法声明,若类中包含抽象方法则该类必须声明为抽象类。因为抽象方法声明不提供实际的实现,所以没有方法体;方法声明只是以一个分号结束,并且在签名后没有大括号 ( )。7.用sealed修饰的类有什么特点sealed修饰符可以应用于类、实例方法和属性。密封类不能被继承。密封方法会重写基类中的方法,但其本身不能在任何派生类中进一步重写。当应用于方法或属性时,sealed修饰符必须始终与override一起使用。将密封类用作基类或将abstract修饰符与密封类一起使用是错误的。结构是隐式密封的;因此它们不能被继承。这种情况中你可以决定如何实现。当然需要特别得小心。但是在编译环节是没有问题的。接口和抽象类的区别是什么?他们的类派生类都必须向上实现;接口中所有方法必须是抽象的,并且不能指定方法的访问修饰符,能继承。抽象类中可以有方法的实现,还可以包含其他一般方法和属性字段,也可以指定方法的访问修饰符。抽象类必须为所有接口成员提供实现。实现接口的抽象类可以将接口方法映射到抽象方法上。interface Ivoid M();abstract class C: Ipublic abstract void M();一、抽象类: 抽象类是特殊的类,它只能用作基类,不能被直接实例化;允许(但不要求)抽象类包含抽象成员。重要的是抽象类可以包括抽象方法和一般方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。二、接口: 接口是引用类型的,一个接口定义一个协定.类似于类,和抽象类的相似之处有三点:1、不能实例化; 2、包含未实现的方法声明; 3、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员); 另外,接口有如下特性:接口可包含方法、属性、索引器、事件,且成员公有。除此之外,不能包含常量、域、构造函数、析构函数、静态成员。一个类可以直接继承多个接口,但只能直接继承一个类(包括抽象类)。三、抽象类和接口的区别: 1.类是对对象的抽象,可以把抽象类理解为把类当作对象,抽象成的类叫做抽象类.而接口只是一个行为的规范或规定,微软的自定义接口总是后带able字段,证明其是表述一类类“我能做.”.抽象类更多的是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类中. 2.接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法;3.一个类一次可以实现若干个接口,但是只能扩展一个父类 4.接口可以用于支持回调,而继承并不具备这个特点. 5.抽象类不能被密封。 6.抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非虚的. 7.(接口)与非抽象类类似,抽象类也必须为在该类的基类列表中列出的接口的所有成员提供它自己的实现。但允许抽象类将接口方法映射到抽象方法上。8.抽象类实现了oop中的一个原则,把可变的与不可变的分离。抽象类和接口就是定义为不可变的,而把可变的座位子类去实现。 9.好的接口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。如果一个类只是实现了这个接口的中一个功能,而不得不去实现接口中的其他方法,就叫接口污染。 10.尽量避免使用继承来实现组建功能,而是使用黑箱复用,即对象组合。因为继承的层次增多,造成最直接的后果就是当你调用这个类群中某一类,就必须把他们全部加载到栈中。同时,有心的朋友可以留意到微软在构建一个类时,很多时候用到了对象组合的方法。比如中,Page类,有ServerRequest等属性,但其实他们都是某个类的对象。使用Page类的这个对象来调用另外的类的方法和属性,这个是非常基本的一个设计原则。 11.如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法. 四、抽象类和接口的使用: 1.如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单的方法来控制组件版本。 2.如果创建的功能将在大范围的全异对象间使用,则使用接口。如果要设计小而简练的功能块,则使用接口。3.如果要设计大的功能单元,则使用抽象类.如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。 4.抽象类主要用于关系密切的对象;而接口适合为不相关的类提供通用功能。1.飞机会飞,鸟会飞,他们都继承了同一个接口“飞”;但是F22属于飞机抽象类,鸽子属于鸟抽象类。2. 就像铁门木门都是门(抽象类),你想要个门我给不了(不能实例化),但我可以给你个具体的铁门或木门(多态);而且只能是门,你不能说它是窗(单继承);一个门可以有锁(接口)也可以有门铃(多实现)。 门(抽象类)定义了你是什么,接口(锁)规定了你能做什么(一个接口最好只能做一件事,你不能要求锁也能发出声音吧(接口污染)。11.ASP.net的身份验证方式有哪些?分别是什么原理?window验证:为每个用户开启window帐号,验证其身份.安全性较高.forms验证:为每个登陆用户写入一个身份验证票据.在web使用最广的验证方式.灵活方便.12.进程和线程分别怎么理解?使用进程来隔离应用程序。二者都表示必须按特定顺序执行的指令序列。但是不同线程或进程中的指令可以并行执行。进程存在于操作系统内,线程存在于进程内。每个进程都由一个或多个线程组成。多个进程的存在使得计算机能够一次执行多个任务,而多个线程的存在使得进程能够分解工作以便平行执行。在含有多处理器的计算机上,可以在不同的进程上运行进程或线程,实现真正的并行处理。并不总是能够完全并行处理,有时需要同步线程。一个线程可能需要等待另一个线程的结果,一个线程也可能需要独占访问另一个线程正在使用的资源。13进程、线程、应用程序域、程序集 之间的关系!应用程序域为安全性、可靠性、版本控制以及卸载程序集提供了隔离边界。应用程序域通常由运行库宿主创建.应用程序域提供了一个更安全、用途更广的处理单元,公共语言运行库可使用该单元提供应用程序之间的隔离。您可以在具有同等隔离级别(存在于单独的进程中)的单个进程中运行几个应用程序域,而不会造成进程间调用或进程间切换等方面的额外开销。在一个进程内运行多个应用程序的能力显著增强了服务器的可伸缩性。隔离应用程序对于应用程序安全也是十分重要的。例如,您可以在单个浏览器进程中运行几个 Web 应用程序中的控件,同时使这些控件不能访问彼此的数据和资源。应用程序域所提供的隔离具有以下优点: 1.在一个应用程序中出现的错误不会影响其他应用程

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论