最新.net面试题
发布时间:2024-11-19 10:11:44浏览次数:9.net 理论知识什么是面向对象 面向对象 OO = 面向对象的分析 OOA + 面向对象的设计 OOD + 面向对象的编程 OOP;通俗的解释就是万物皆对象,把所有的事物都看作一个个可以独立的对象(单元),它们可以自己完成自己的功能,而不是像 C 那样分成一个个函数; 现在纯正的 OO 语言主要是 java 和 C#,C++也支持 OO,C 是面向过程的。阐述面向接口、面向对象、面向方面编程的区别面向对象不好解释,可以理解为以一切元素都是对象,在设计时以对象为单位,考虑它的属性及方法。设计中采用了封装、继承、抽象的手法面向接口本身就是面向对象的,无所谓区别,只不过面向接口的好处是耦合性低面向方面 Aspect-Oriented Programming (AOP)就是大名鼎鼎的 AOP。其实有点象 struts 里的拦截。 举例:假设有在一个应用系统中,有一个共享的数据必须被并发同时访问,首先,将这个数据封装在数据对象中,称为 Data Class,同时,将有多个访问类,专门用于在同一时刻访问这同一个数据对象。为了完成上述并发访问同一资源的功能,需要引入锁 Lock 的概念,也就是说,某个时刻,当有一个访问类访问这个数据对象时,这个数据对象必须上锁 Locked,用完后就立即解锁 unLocked,再供其它访问类访问。 面向对象的思想主要包括什么?继承:子类拥有父类的所有数据和操作。封装:用抽象的数据类型将数据和基于数据的操作封装在一起,数据被保护在抽象数据类型内。多态:一个程序中同名的不同方法共存的情况。有两种形式的多态–重载与重写。 抽象类是否可以继承实体类?抽象类可以继承实体类,但是有个条件,条件是,实体类必须要有明确的构造函数。当类 T 只声明了私有实例构造函数时,则在 T 的程序文本外部,是否可以从 T 派生出新的类,是否可以直接创建 T 的任何实例。不可以,不可以C#中有没有静态构造函数,如果有是做什么用的? 有. 静态构造函数用于初始化类。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。静态构造函数既没有访问修饰符,也没有参数。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。无法直接调用静态构造函数。在程序中,用户无法控制何时执行静态构造函数。静态构造函数的典型用途是:当类使用日志文件时,将使用这种构造函数向日志文件中写入项。什么是.net? .net 是一种平台和框架, .net 不是单纯的语言也不是单纯的工具,它是从底层平台开始构建起来的一个整体框架请以图示方式解释.net framework?VBC++C#Jscript…Common Language SpecificationXML WebservicesWeb FormsWindows FormsData and XMLBase Class LibraryCLRCLI
{ Name myname=new Name(); myname.Get += delegate(object sender, Name.NameEventArgs e) { }; }}也可以用 Lambda 表达式把 delegate 隐藏class EventDel{ static void Main(string[] args) { Name myname=new Name(); myname.Get += (object sender, Name.NameEventArgs e) => { }; }}事件是不是一种委托?委托是一种安全的函数指针,事件是一种消息机制委托与事件是什么关系?为什么要使用委托 委托提供了封装方法的方式,事件是某动作已发生的说明,事件是建立于委托之上的 程序运行时同一个委托能够用来调用不同的方法,只要改变它的引用方法即可,因此委托调节器用的方法不是在编译时决定的,而是在运行时确定的.请解释这种语法现象 Session[“name”]=20; 给类的索引器赋值.ASP.Net 的身份验证方式有哪些?分别是什么原理?Asp.net 的身份验证有有三种,分别是"Windows | Forms | Passport",window 验证: ASP.NET 会结合信息服务 (IIS),为每个用户开启 window 帐号,验证其身份,安全性较高。forms 验证:为每个登陆用户写入一个身份验证票据,在 web 使用最广的验证方式,灵活方便。passport 验证:由 Microsoft 提供的集中身份验证服务,该服务为成员站点提供单一登录和核心配置什么是 code-Behind 技术。就是代码隐藏,在 ASP.NET 中通过 ASPX 页面指向 CS 文件的方法实现显示逻辑和处理逻辑的分离,这样有助于 web 应用程序的创建。比如分工,美工和编程的可以个干各的,不用再像以前 asp 那样都代码和 html 代码混在一起,难以维护。新建一个 VS.Net 下的项目。。看到 ASPX,RESX 和 CS 三个后缀的文件,这个就是代码分离。实现了 HTML 代码和服务器代码分离,方便代码编写和整理。活动目录。活动目录是 window2000 的最重要的功能。可以将用户信息全部集成起来,登陆以后可以访问多个不同的网络服务。。活动目录包括两个方面:目录和与目录相关的服务。安装了活动目录的计算机称为“域控制器”,对于用户而言,只要加入并接受域控制器的管理就可以在一次登录之后全网使用,方便地访问活动目录提供的网络资源。对于管理员,则可以通过对活动目录的集中管理就能够管理全网的资源。.Net 中读写 XML 的类都归属于哪些命名空间?System.XML 命名空间,任何类型的项目都可以通过 System.XML 命名空间进行 XML 处理。使用System.Xml 命名空间中的 XmlDocument 类来操作 xml 的数据C#中 Socket 所在的命名空间是?System.Net.Sockets。 Socket 类为网络通信提供了一套丰富的方法和属性。Socket 类允许您使
用 ProtocolType 枚举中所列出的任何一种协议执行异步和同步数据传输。什么是 SOAP,有哪些应用。SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息并执行远程过程调用的协议,是一个基于 XML 的协议。使用 SOAP,不用考虑任何特定的传输协议(最常用的还是 HTTP 协议),可以允许任何类型的对象或代码,在任何平台上,以任何一直语言相互通信。这种相互通信采用的是 XML 格式的消息。SOAP 是一种轻量级协议,用于在分散型、分布式环境中交换结构化信息。 SOAP 利用 XML 技术定义一种可扩展的消息处理框架,它提供了一种可通过多种底层协议进行交换的消息结构。 这种框架的设计思想是要独立于任何一种特定的编程模型和其他特定实现的语义。如何理解.Net 中的垃圾回收机制。垃圾回收器每次进行垃圾回收时,对堆上的对象进行检查,把没有被任何变量引用的对象销毁。但并不是检查堆上的每个对象,而是将对象进行分类,将所有对象分类三代(generation)。生命周期越短(新创建的对象)代数越小,反之越大。在堆空间不够用时,垃圾回收器回收垃圾,检查第 0 代对象,如果发现没有被引用的对象,则标记这些为“垃圾”,并销毁。而幸存的部分的第 0 代对象将升级为第 1 代对象,某些标记为“垃圾”的对象也会幸存而升级。这时如果堆空间仍然不够用(如创建比较大的新对象),垃圾收集器将会检查第 1代对象,将没有引用的对象进行销毁。幸存部分升级为第 2 代对象,当内存堆空间仍然不够用时,检查第 2 代对象,不过第 2 代对象检查后仍然是第 2 代对象,不会继续升级。如果发现内存不够,则垃圾回收器,将全部对象作为无效对象(被回收对象),然后先将全局变量,static,处于活动中的局部变量,以及当前 CG 指针指向的对象放入一个表中。然后会搜索新列表中的对象所引用的对象,加入列表中,其他没有被加入列表的对象都会被回收。垃圾回收器优化引擎根据正在进行的分配情况确定执行回收的最佳时间。当垃圾回收器执行回收时,它检查托管堆中不再被应用程序使用的对象并执行必要的操作来回收它们占用的内存。 三个 generation,当每个 generation 内存满了的时候检查引用,无引用就回收内存常用的调用 webservice 方法有哪些? 1.使用 WSDL.exe 命令行工具。2.使用 VS.NET 中的 Add Web Reference 菜单选项什么是 XML?列举一下你所了解的 XML 技术及其应用 XML 即可扩展标记语言。eXtensible Markup Language.标记是指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等。如何定义这些标记,即可以选择国际通用的标记语言,比如 HTML,也可以使用象 XML 这样由相关人士自由决定的标记语言,这就是语言的可扩展性。XML 是从 SGML 中简化修改出来的。它主要用到的有 XML、XSL 和 XPath 等。 xml 可以用来做网页(xslt);xml 可以当作数据库;xml 可以用来保存对象的系列化;xml 用于配置;用于保存静态数据类型。接触 XML 最多的是 web Services 和 configXML 与 HTML 的主要区别1. XML 是区分大小写字母的,HTML 不区分。 2. XML 中,绝对不能省略掉结束标记。在 HTML 中,如果上下文清楚地显示出段落或者列表键在何处结尾,那么你可以省略</p>或者</li>之类的结束 标记。3. 在 XML 中,拥有单个标记而没有匹配的结束标记的元素必须用一个 / 字符作为结尾。这样分析器就知道不用 查找结束标记了。 4. 在 XML 中,属性值必须在引号中。在 HTML 中,引号是可用可不用的。 5. 在 XML 中,所有的属性都必须带有相应的值。在 HTML 中,可以拥有不带值的属性名。C#中 property 与 attribute 的区别,他们各有什么用处,这种机制的好处在哪里? property 和 attribute 汉语都称之为属性。 property 一个是属性,用于存取类的字段,类向外提供的数据区域, attribute 一个是特性,用来标识类,方法等的附加性质, 描述对象在编译时或运行时属性的.C#可否对内存进行直接的操作? 这个问题比较难回答,也是个很大的问题。但是可以这样问答。C#是可以对内存进行直接操作的,虽然很少用到指针,但是 C#是可以使用指针的,在用的时候需要在前边加 unsafe,,
在.net 中使用了垃圾回收机制(GC)功能,它替代了程序员,不过在 C#中不可以直接使用 finalize 方法,而是在析构函数中调用基类的 finalize()方法。用最有效的方法算出 2 的 3 次方 8 等于几?2<<3.维护数据库的完整性、一致性、你喜欢用触发器还是自写业务逻辑?为什么触发器,性能好,事务性ADO.NET 相对于 ADO 等主要有什么改进? 简单的说,ADO.NET 新增 dataset 等,不需要随时保持连接,性能提高. 1:ADO.Net 不依赖于 ole db 提供程序,而是使用.net 托管提供的程序,2:不使用 com3:不在支持动态游标和服务器端游 4:,可以断开 connection 而保留当前数据集可用 5:强类型转换 6:xml 支持 您可以通过将 ADO.NET 的各项功能与 ActiveX 数据对象 (ADO) 的特定功能进行比较来理解 ADO.NET 的功能。 1、数据的内存中表示形式 在 ADO 中,数据的内存中表示形式为记录集。在 ADO.NET 中,它为数据集。它们之间有重要的差异。 2、表的个数 记录集看起来像单个表。如果记录集将包含来自多个数据库表的数据,则它必须使用 JOIN 查询,将来自各个数据库表的数据组合到单个结果表中。 相反,数据集是一个或多个表的集合。数据集内的表称为数据表;明确地说,它们是 DataTable 对象。如果数据集包含来自多个数据库表的数据,它通常将包含多个 DataTable 对象。即,每个 DataTable 对象通常对应于单个数据库表或视图。这样,数据集可以模仿基础数据库的结构。 数据集通常还包含关系。数据集内的关系类似于数据库中的外键关系,即它使多个表中的行彼此关联。例如,如果数据集包含一个有关投资者的表和另一个有关每个投资者的股票购买情况的表,则数据集可能还包含一个关系来连接投资者表的各个行和购买表的对应行。 由于数据集可以保存多个独立的表并维护有关表之间关系的信息,因此它可以保存比记录集丰富得多的数据结构,包括自关联的表和具有多对多关系的表。 3、数据导航和游标 在 ADO 中,您使用 ADO MoveNext 方法顺序扫描记录集的行。在 ADO.NET 中,行表示为集合,因此您可以像依次通过任何集合那样依次通过表,或通过序号索引或主键索引访问特定行。DataRelation 对象维护有关主记录和详细资料记录的信息,并提供方法使您可以获取与正在操作的记录相关的记录。例如,从 Investor 表的"Nate Sun"的行开始,可以定位到 Purchase 表中描述其购买情况的那组行。 "游标"是数据库元素,它控制记录导航、更新数据的能力和其他用户对数据库所做更改的可见性。ADO.NET 不具有固有的游标对象,而是包含提供传统游标功能的数据类。例如,在 ADO.NET DataReader 对象中提供只进、只读游标的功能。有关游标功能的更多信息,请参见数据访问技术。 4、将打开连接的时间降至最低 在 ADO.NET 中,打开连接的时间仅足够执行数据库操作,例如"选择"(Select) 或"更新"(Update)。您可以将行读入数据集中,然后在不保持与数据源的连接的情况下使用它们。 在 ADO 中,记录集可以提供不连接的访问,但 ADO 主要是为连接的访问设计的。 ADO 和 ADO.NET 中的不连接处理之间存在一个显著差异。在 ADO 中,通过调用 OLE DB提供程序来与数据库通信。但在 ADO.NET 中,您通过数据适配器(OleDbDataAdapter、SqlDataAdapter、OdbcDataAdapter 或 OracleDataAdapter 对象)与数据库通信,这将调用 OLE DB 提供程序或基础数据源提供的 API。ADO 和 ADO.NET 之间的主要区别在于: 在 ADO.NET 中,数据适配器允许您控制将对数据集所做的更改传输到数据库的方式,方法是实现性能优化、执行数据验证检查或添加其他任何额外处理。
注意:数据适配器、数据连接、数据命令和数据读取器是组成 .NET Framework 数据提供程序的组件。Microsoft 和第三方供应商可能会提供其它提供程序,这些提供程序也可集成到 Visual Studio 中。有关不同 .NET 数据提供程序的信息,请参见 .NET 数据提供程序。 5、在应用程序间共享数据 在应用程序间传输 ADO.NET 数据集比传输 ADO 不连接的记录集要容易得多。若要将 ADO 不连接的记录集从一个组件传输到另一个组件,请使用 COM 封送。若要在 ADO.NET 中传输数据,请使用数据集,它可以传输 XML 流。 相对于 COM 封送,XML 文件的传输提供以下便利之处: 更丰富的数据类型 COM 封送提供一组有限的数据类型(由 COM 标准定义的那些类型)。由于 ADO.NET 中的数据集传输基于 XML 格式,所以对数据类型没有限制。因此,共享数据集的组件可以使用这些组件一般会使用的任何丰富的数据类型集。 6、性能 传输大型 ADO 记录集或大型 ADO.NET 数据集会使用网络资源;随着数据量的增长,施加于网络的压力也在增加。ADO 和 ADO.NET 都使您可以最大限度地降低所传输的数据。但 ADO.NET 还提供另一个性能优势:ADO.NET 不需要数据类型转换。而需要 COM 封送来在组件间传输记录集的 ADO,则需要将 ADO 数据类型转换为 COM 数据类型。 7、穿透防火墙 防火墙可以影响试图传输不连接的 ADO 记录集的两个组件。请记住,防火墙通常配置为允许 HTML 文本通过,但防止系统级请求(如 COM 封送)通过。 因为组件使用 XML 交换 ADO.NET 数据库,所以防火墙可以允许数据集通过。ASP.Net 与 ASP 相比,主要有哪些进步?asp 解释型,aspx 编译型,性能提高,有利于保护源码ASP 的缺点:l VBScript 和 JavaScript 是在 ASP 中仅可使用的两种脚本语言。它们是基本的非类型化语言。在ASP 中不能使用强类型语言.l ASP 页面需要解释,使得它执行速度较慢。l ASP 页面非常凌乱。l 在使用 ASP 创建 WEB 应用程序时,程序员和设计人员必须在同一文件上一起工作。l 在 ASP 中,必须通过编写代码来提供所需的任何功能。l 在 ASP 中没有对代码给予太多的关注。l 在 ASP 中没有调试机制。l 在 ASP 中。必须停止 WEB 服务器才能安装 DLL 的新版本,并且在应用程序中使用 DLL 的新版本之前,必须先在注册表中注册它,而且,DLL 注册过程非常复杂。ASP.NET 的优点:l ASP.Net 中支持强类型语言.l ASP.Net 页将被编译而不是解释,这样它们的执行速度就比 ASP 页快。l ASP.Net 提供声明性服务器控件。l ASP.Net 通过继承机制来支持代码的重用。l ASP.Net 具有 Trace 的内置方法,可以帮助对页面进行调试。l 在 ASP.Net 中,置于应用程序的 BIN 目录中的任何组件将自动对应用程序可用.你对 XML,HTTP、WEBSERVICE 了解吗?简单描述其特点、作用xmlhttp 可以主动获取远端 web 代码,类似 HttpWebRequest存储过程和函数的区别存储过程是编译好的存储在数据库的操作,函数不用说了。Session,ViewState,Application,cookie 的区别? Session:用于保持状态的基于 Web 服务器的方法。Session 允许通过将对象存储在 Web 服务器的内存中在整个用户会话过程中保持任何对象。主要用于保持代码隐藏类中对象的状态。为每个用户创建的,用于存储单个用户,因为他是相对每个用户的.所以可能来取得在线人数等。 ViewState:主要用于保持 Web 页上控件的状态。当 Web 页上的控件被绑定到代码隐藏类中的对象。 Application 用于存储所有用户都可视的信息.所以它存储的是要让所有用户共享的一些信息.如总
访问数等 Cache,页面缓存。 Cookie:通常我们都把它放在客户端,也可以存储在服务器端。主要用它存储用户的个性设制,和登陆信息。请说明在.Net 中常用的几种页面间传递参数的方法,并说出他们的优缺点。1、queryString url 参数 简单,显示于地址栏,长度有限优点:简单易用;资源占用比较少。缺点:传递数据大小有限制,只能传递基本类型的数据,安全性差2、session(viewstate)优点:简单,灵活性强,能传递复杂的对象缺点:但易丢失,资源消耗大3、cookie 优点:简单,缺点:但可能不支持,可能被伪造,大小有限制不能超过 4KB 不恩能够存储复杂对象4、this.Server.Transfer,优点:URL 地址不变,安全性高,灵活性强,能传递复杂的对象缺点:资源消耗大5、hidden control/viewstate 简单,可能被伪造6、static member。 7、cache 8、application优点:全局缺点:资源消耗大9、DataBase 数据库 稳定,安全,但性能相对弱10、xml or other Files 11、XMLHTTP or Hidden iFrame/frame 12、Context.user.identity 我正在做一个通用提示页面,所有页面出现问题都要,传递几个变量字符串到同一个页面 hitMsg。aspx 变量字符串包括提示语言,即将跳转的页面,跳转时间。在上面的种方案中哪个更好些? (1)queryString 的毛病是无法传递很长字符串,比如系统错误信息往往就一整个屏幕。 (2)session 的毛病是不能过多使用,容易丢失。 (3)cookie 的毛病是依赖客户端设置,不可靠。 (4)server.transfer 的毛病是接收页面要为发送页面准备好,只能定制专门一个页面接受定制好的页面。不能是一个页面接受任何页面。 (5)hidden control/viewstate 只能传递本页。除非特殊制作。 (6)static member。无法保证线程安全,可能会此处栽瓜他处得豆。 (7)cache 不适合使用一次就扔的变量。 (8)application 全局的,开销大。 (9)DataBase 全局固化的,开销更大,除非做日志跟踪。 (10)xml or othe Files 全局固化的,开销大,除非做日志跟踪。 (11)XMLHTTP or Hidden iFrame/frame,做这个过于烦琐。 (12)Context 这个占用了用户 id,不适合做这个。如果在一个 B/S 结构的系统中需要传递变量值,但是又不能使用 Session、Cookie、Application,您有几种方法进行处理?input type="hidden" 简单,可能被伪造url 参数 简单,显示于地址栏,长度有限数据库 稳定,安全,但性能相对弱this.Server.Transfer,在新页面获得值的代码如下:if (Page.PreviousPage != null){ TextBox st =
(TextBox)Page.PreviousPage.FindControl("TextBox1"); if (st != null) { Label1.Text = SourceTextBox.Text; }}ASP.NET 页面跳转的几种方法超链接跳转<a>标签1. <a href=”test.aspx”></a>2.这是最常见的一种转向方法;HyperLink 控件1.Asp.net 服务器端控件属性 NavigateUrl 指定要跳转到的 Url 地址2. NavigateUrl 是可以在服务器端使用代码修改,这个区别于<a>3.由于 HyperLink 本身没有事件所以要在服务器端其它事件中设置 NavigateUrl4.代码示例<Asp:HyperLink id=”hyperlink” runat=”server” NavigatoeUrl=”test.aspx”>ok</Asp:HyperLink>Response.Redirect()方法1.过程:发送一个 Http 响应到客户端,通知客户端跳转到一个新的页面,然后客户端再发送跳转请求到服务器端。2.页面跳转之后内部控件保存的所有信息丢失,当 A 跳转到 B,B 页面将不能访问 A 页面提交的数据信息。3.使用这个方法使用这个方法跳转后浏览器地址栏的 Url 信息改变4.可以使用 Session Cookies Application 等对象进行页面间的数据传递5.重定向操作发生在客户端,总共涉及到两次与 Web 服务器的通信:一次是对原始页面的请求,另一次是重定向新页面的请求Server.Transfer()方法1.实现页面跳转的同时将页面的控制权进行移交2.页面跳转过程中 Request Session 等保存的信息不变,跳转之后可以使用上一个页面提交的数据3.跳转之后浏览器地址栏的 Url 不变4.这种方法的重定向请求是在服务器端的进行的,浏览器不知道页面已经发生了一次跳转Server.Execute()方法1.该方法允许当前页面执行同一个 Web 服务器上的另一个页面2.页面执行完毕之后重新回到原始页面发出 Server.Execute()的位置。3.这种方式类似针对页面的一次函数调用被请求的页面可以使用原始页面的表单数据和查询字符串集合4.被调用页面的 Page 指令的 EnableViewStateMac 属性设置为 False通过超链接怎样传递中文参数?URLEncode URLDecode请说出强名的含义对程序集,进行公钥/私钥对签名,称为强名。用名称,版本,文化,公钥唯一确定程序集具有自己的 key,可以在 GAC 为公用请列出 c#中几种循环的方法,并指出他们的不同For :使用于确定次数的循环Foreach:使用于遍历的元素只读While:次数不确定条件随机变化Do…while:次数不确定条件随机变化,但至少要保证能被执行一次请指出.Net 中所有类型的基类Object
C#中有没有运算符重载?能否使用指针? 有,重载操作符意味着使该操作符具有不同的行为;使用操作符可以使方程式简单易懂;重载运算符使用 operator 关键字来创建一个运算符方法,只能在类或结构中使用 Operator 例:下面的代码示例使用 Operator 语句定义一个结构的大纲,该结构包括 And、Or 运算符的运算符过程。And 和 Or 每个都采用两个类型为 abc 的操作数,并返回类型 abc。这些定义允许调用代码通过 abc 类型的操作数来使用 And、Or。Public Structure abc Public Shared Operator And(ByVal x As abc, ByVal y As abc) As abc Dim r As New abc ' Insert code to calculate And of x and y. Return r End Operator Public Shared Operator Or(ByVal x As abc, ByVal y As abc) As abc Dim r As New abc ' Insert code to calculate Or of x and y. Return r End OperatorEnd Structure 能使用指针, 在 C# 中很少需要使用指针,但仍有一些需要使用的情况。例如,在下列情况中使用允许采用指针的不安全上下文是正确的: l 处理磁盘上的现有结构 l 涉及内部包含指针的结构的高级 COM 或平台调用方案 l 性能关键代码 不鼓励在其他情况下使用不安全上下文。具体地说,不应该使用不安全上下文尝试在 C#中编写 C 代码。C#可否对内存进行直接的操作?(这可是个难点哦?要注意!) C#在 unsafe 模式下可以使用指针对内存进行操作, 但在托管模式下不可以使用指针,C#NET 默认不运行带指针的,需要设置下,选择项目右键->属性->选择生成->“允许不安全代码”打勾->保存using System;public class Program{ public static void Main() { int n = 123; unsafe { int* p = &n; Console.WriteLine("{0:X}", n); Console.WriteLine("{0:X}", *p); Console.WriteLine("{0}", p->ToString()); } }}结果:7B7B123请按任意键继续. . .用 Visual C++ 6.0 编写的代码(unmanaged code),如何在 CLR 下和其他 dot net component 结合?
net 与 Com 互操作 在.net 中可以通过添加引用的方式将 COM 加载在 CLR 下,将原有的COM 中的类型相应变化为.Net 下可识别的类型私有程序集与共享程序集有什么区别? 一个私有程序集通常为单个应用程序所使用,并且存储于这个应用程序所在的目录之中,或此目录下面的一个子目录中。共享程序集通常存储在全局程序集缓存(Global Assembly Cache)之中,这是一个由.NET 运行时所维护的程序集仓库。共享程序集通常是对许多应用程序都有用的代码库,比如.NET Framework 类。私有程序集: l 默认情况下,C# 程序编译为私有程序集l 需要放在应用程序所在的文件夹中l 程序集的名称在应用程序中应当是唯一的共享程序集:l 可以被不同的应用程序共享l 在所有使用程序集的应用程序中,程序集名称应当是唯一的l 放在全局程序集缓存中什么是 GAC?它解决了什么问题? Gloal Assembly Cache,全局应用程序集缓存。它解决了几个程序共享某一个程序集的问题。不必再将那个被共享的程序集拷贝到应用程序目录了,其实这道理很简单,.net 应用程序在加载的时候,会首先查看全局应用程序集缓存,如果有就可以直接使用,没有再到应用程序目录进行查找。请指出 GAC 的含义 全局程序集缓存(Global Assembly Cache)可全局使用的程序集的缓存。大多数共享程序集都安装在这个缓存中,其中也安装了一些私有程序集。存放共享程序的文件夹,可被任何项目使用在全局程序集缓存中部署的应用程序必须具有强名称。.Net 提供的命令行工具 gacutil.exe 用于支持这一功能。gacutil.exe 可以将具有强名称的程序集添至全局程序集缓存。怎样理解静态变量?所有实例公用一个的变量向服务器发送请求有几种方式?区别?get post get 一般为链接方式,post 一般为按钮方式。主要区别如下:1、get 从服务器上获取数据,post 向服务器传送数据2、get 把参数队列加到表单 Action 所指定的 URL 地址中,值和表单内的各个字段一一对应,在URL 中可以显示出来。post 把表单中的各个字段及其内容放到 HTML Header 里,一起传送到 Action 所指定的 URL 地址中,不会在 URL 中可以显示出来3、对于 get,服务器端用 Request.QueryString 获取变量提交的值,对于 post 服务器端用Request.Form 获取提交的数据。4、因受到 URL 长度的限制,get 传输的数据量少,不能大于 2K,post 传输的数据量较大,一般默认没限制。理论上 IIS5 中为 100K,最大可以达到 2M5、get 安全性低,post 安全性高软件开发过程一般有几个阶段?每个阶段的作用?需求分析,架构设计,代码编写,QA,部署需求分析,概要设计,详细设计,软件编码,软件测试可行性分析,需求分析 ,实施和编码,测试,维护 分析(需要,概要,详细),开发(编程,单元测试),测试(集成测试),维护。有哪几种方法可以实现一个类存取另外一个类的成员函数及属性,并请举列来加以说明和分析。取:类在封装时将属性及函数设置成 public存:继承同一个名称控件直接,或者反射如果需记录类的实例个数,该如何实现,请写一个简单的类于以证明。const static int classNum=0;classNum++;
A 类是 B 类的基类,并且都有自己的构造,析构函数,请举例证明 B 类从实例化到消亡过程中构造,析构函数的执行过程。构造先父后子,析够反之需要实现对一个字符串的处理,首先将该字符串首尾的空格去掉,如果字符串中间还有连续空格的话,仅保留一个空格,即允许字符串中间有多个空格,但连续的空格数不可超过一个。string inputStr=" xx xx ";inputStr=Regex.Replace(inputStr.Trim()," *"," ");new 有几种用法1、new 运算符,创建对象,调用构造函数2、new 修饰符 覆盖方法,隐藏父类的成员。public new XXXX(){}3、new 约束 用于在泛型声明中,约束指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数。当泛型类创建类型的新实例时,将此约束应用于类型参数,当与其他约束一起使用时,new()约束必须最后指定。如:public class ItemFactory<T> where T : IComparable, new(){}在 c#中 using 和 new 这两个关键字有什么意义,请写出你所知道的意义?using 引入名称空间或者使用非托管资源new 新建实例或者隐藏父类方法下面这段代码输出什么?为什么? int i=5; int j=5; if (Object.ReferenceEquals(i,j)) Console.WriteLine("Equal"); else Console.WriteLine("Not Equal");输出 Not Equal 。不相等,因为比较的是对象。ReferenceEquals(object a,object b),里面的两个参数是 object 对象写一个实现对一段字符串翻转的方法,附加一些条件,如其中包括“,”、“。”,对其设计测试用例inputStr=inputStr.ToCharArray().Reverse().ToString();用 Singleton 如何写设计模式static 属性里面 new ,构造函数 private什么是 Application Pool?Web 应用,类似 Thread Pool,提高并发性能链表和数组的区别,各有什么优缺点。一个可以动态增长,一个固定(VB 中可以 Redim),性能数组教好什么是友元函数?friendly 声明,可以访问 protect 级别方法什么是虚函数?可以被重写什么是抽象函数?必须被重写什么是内存泄漏,怎样最简单的方法判断内存泄漏 ?C++,C 中忘了释放内存,内存不会再次分配C#中有很多类被定义为 public 有什么意义? public 关键字将公共访问权限授予一个或多个被声明的编程元素。对公共元素的可访问性没有限制。Internal 修饰符有什么含义? internal 关键字是类型和类型成员的访问修饰符。内部成员只有在同一程序集中的文件
内才是可访问的。内部访问通常用于基于组件的开发,因为它使一组组件能够以私有方式进行合作,而不必向应用程序代码的其余部分公开。例如,用于生成图形用户界面的框架可以提供“控件”类和“窗体”类,这些类通过使用具有内部访问能力的成员进行合作。由于这些成员是内部的,它们不向正在使用框架的代码公开。在定义具有内部访问能力的成员的程序集外部引用该成员是错误的。简述 private、 protected、 public、 internal 修饰符的访问权限。private : 私有成员, 在类的内部才可以访问。protected : 保护成员,该类内部和继承类中可以访问。public : 公共成员,完全公开,没有访问限制。internal: 在同一命名空间内可以访问。JAVA 的代码是半编译半解释的 C#的代码是否也是这样 C#源码经过语言编译器执行第一次编译,变为中间语言,然后再由 CLR 编译成可执行代码.进程和线程的区别1、单位:进程是系统进行资源分配和调度的单位;线程是 CPU 调度和分派的单位。2、一个进程可以有多个线程,这些线程共享这个进程的资源。 进程是比线程大的程序运行单元,都是由操作系统所体会的系统运行单元,一个程序中至少要有一个进程,有一个进程中,至少要有一个线程,线程的划分尺度要比进程要小。3、进程拥有独立的内存单元,线程是共享内存,从而极大的提高了程序的运行效率同一个进程中的多个线程可以并发执行。4、边界:二者都定义了某种边界,进程是应用程序与应用程序之间的边界,不同的进程之间不能共享代码和数据空间,而线程是代码执行堆栈和执行上下文的边界。成员变量和成员函数前加 static 的作用 它们被称为常成员变量和常成员函数,又称为类成员变量和类成员函数。分别用来反映类的状态。比如类成员变量可以用来统计类实例的数量,类成员函数负责这种统计的动作。malloc 和 new 的区别 new 是 C++的关键字。malloc 在分配内存时必须按给出的字节分配,new 可以按照对象的大小自动分配,并且能调用构造函数。可以说 new 是对象的对象,而 malloc 不是。本质上 new 分配内存时,还会在实际内存块的前后加上附加信息,所以 new 所使用的内存大小比 malloc 多。堆和栈的区别 栈:编译期间就分配好的内存空间,是由是操作系统(编译器)自动分配和释放的,栈上的空间是有限的。程序在编译期间变量和函数分配内存都是在栈上进行的,且在运行时函数调用时的参数的传递也是在栈上进行的。 堆:程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小。一般由程序员分配释放。用 new、malloc 等分配内存函数分配得到的就是在堆上。 栈是机器系统提供的数据结构,而堆则是 C/C++函数库提供的。 栈是系统提供的功能,特点是快速高效,缺点是有限制,数据不灵活;而栈是函数库提供的功能,特点是灵活方便,数据适应面广泛,但是效率有一定降低。栈是系统数据结构,对于进程/线程是唯一的;堆是函数库内部数据结构,不一定唯一。不同堆分配的内存无法互相操作。栈空间分静态分配和动态分配两种。静态分配是编译器完成的,比如自动变量(auto)的分配。动态分配由 alloca 函数完成。栈的动态分配无需释放(是自动的),也就没有释放函数。为可移植的程序起见,栈的动态分配操作是不被鼓励的!堆空间的分配总是动态的,虽然程序结束时所有的数据空间都会被释放回系统,但是精确的申请内存/释放内存匹配是良好程序的基本要素。在.Net 中,类 System.Web.UI.Page 可以被继承么?可以你觉得 ASP.Net 2。0(VS2005)和你以前使用的开发工具(.Net 1。0 或其他)有什么最大的区别?你在以前的平台上使用的哪些开发思想(pattern / architecture)可1 ASP.Net 2。0 把一些代码进行了封装打包,所以相比 1。0 相同功能减少了很多代码。2 同时支持代码分离和页面嵌入服务器端代码两种模式,以前 1。0 版本,.Net 提示帮助只有在分离的代码文件,无法在页面嵌入服务器端代码获得帮助提示,3 代码和设计界面切换的时候,2。0 支持光标定位。这个我比较喜欢
Visual Studio .NET程序集与命名空间有什么不同? 命名空间是用于避免命名冲突,专用于组织代码,当代码要在其他某个应用程序中重用时,可以降低复杂性。 程序集是重用代码的一种方式验证控件不同: 可以将相同命名空间中的类部署到不同的程序集中,也可以命名空间中的类部署到一个程序集中命名空间 程序集有逻辑编译时机制 有物理编译时机制不是运行时实体 是运行时实体为源代码元素的名称提供逻辑结构 为可执行文件的运行时提供物理结构什么是 WEB 控件?使用 WEB 控件有那些优势? WEB 控件是能拖放在 WEB 页面上的控件 WEB 控件分为:内部控件, 列表控件, 复杂控件, •WEB 控件优势:l Web 控件是对象,与对象一样,Web 控件拥有方法和属性,并且响应事件l 一旦将 Web 控件包括在 Web 页中,就可以设置其属性并调用其方法l 可以为 Web 控件编写服务器端代码以响应在客户端上发生的事件ASP。NET 中共有几种类型的控件?各有什么区别? WEB 控件分为:内部控件, 列表控件, 复杂控件, 验证控件 内部控件:内部控件的使用方法与 HTML 控件相同,它们映射到 HTML 元素并通过使用 runat = "server" 属性在服务器上执行 列表控件:用于在 Web 页中创建数据列表 复杂控件:当希望控件拥有复杂的功能或使用 HTML 元素无法创建的功能丰富的用户界面时,可以使用复杂控件 验证控件:输入控件的数据需要进行准确性和取值范围方面的检查WEB 控件可以激发服务端事件,请谈谈服务端事件是怎么发生并解释其原理?自动传回是什么?为什么要使用自动传回。 由于 ASP。NET 是 Web 页面和服务端分离的,因此要产生了服务端事件. 使用_doPostBack 函数能够自动地把客户端的 javascript 事件转变为一个服务器端的事件,Asp.net 框架自动为我们处理有关的细节简化工作。 使用自动传回的特性:在检测到一个特定用户动作时,自动传回能够将这个页面传回服务器以处理事件. 在 web 控件发生事件时,客户端采用提交的形式将数据交回服务端,服务端先调用 Page_Load事件,然后根据传回的状态信息自动调用服务端事件自动传回是当我们在点击客户端控件时,采用提交表单的形式将数据直接传回到务端。只有通过自动传回才能实现服务端事件的机制,如果没有自动回传机制就只能调用客户端事件,而不能调用服务端事件请解释 ASP.NET 中以什么方式进行数据验证。 Aps.net 中有非空验证,比较验证,取值范围验证,正则表达式验证及客户自定义验证五大控件,另还有一个集中验证信息处理控件什么是 ASP.Net 中的用户控件用户控件是能够在其中放置标记和 Web 服务器控件的容器。然后,可以将用户控件作为一个单元对待,为其定义属性和方法。用户控件以。ascx 为扩展名,可以拖到不同的页面中调用,以节省代码。比如登陆可能在多个页
4 在绑定数据,做表的分页。UPDATE,DELETE,等操作都可以可视化操作,方便了初学者5, 在 ASP.Net 中增加了 40 多个新的控件,减少了工作量.Net 的错误处理机制是什么 .Net 错误处理机制采用 try->catch->finally 结构,发生错误时,层层上抛,直到找到匹配的Catch 为止。如何把一个 array 复制到 arrayList 里例 1、foreach( object o in array )arrayList.Add(o);例 2、string[] s ={ "111", "22222" }; ArrayList list = new ArrayList(); list.AddRange(s);例 3、string[] s ={ "111", "22222" }; ArrayList list = new ArrayList(s);DataGrid.Datasouse 可以连接什么数据源DataTable、DataView、DataSet、DataViewManager任何实现 IListSource 或 IList 接的组件概述反射和序列化反射:程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射在运行时动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性通过反射命名空间中的类以及 System.Type,可以使用反射在运行时动态地创建类型的实例,然后调用和访问这些实例。也可以获取有关已加载的程序集和在其中定义的类型(如类、接口和值类型)的信息。序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。在另一端,反序列化将从该流重新构造对象。概述 o/r mapping 的原理利用反射,配置 将类于数据库表映射用 sealed 修饰的类有什么特点sealed 修饰符用于防止从所修饰的类派生出其它类。如果一个密封类被指定为其他类的基类,则会发生编译时错误。密封类不能同时为抽象类。sealed 修饰符主要用于防止非有意的派生,但是它还能促使某些运行时优化。具体说来,由于密封类永远不会有任何派生类,所以对密封类的实例的虚拟函数成员的调用可以转换为非虚拟调用来处理。UDP 连接和 TCP 连接的异同。 UDP 是用户数据报协议,是一个简单的面向数据报的传输协议,是不可靠的连接。 TCP 是传输控制协议,提供的是面向连接的,是可靠的,字节流服务,当用户和服务器彼此进行数据交互的时候,必须在他们数据交互前要进行 TCP 连接之后才能传输数据。TCP 提供超时重拨,检验数据功能。 前者只管传,不管数据到不到,无须建立连接。后者保证传输的数据准确,须要连结。.net 中读写数据库需要用到哪些类?列举 ADO.Net 中的五个主要对象,他们的作用 Connection 用来创建一个到数据库的连接 DataAdapter 用来将数据填充到 DataSet,在数据源和 DataSet 间起数据传输 DataSet 可以视为一个暂存区(Cache),把从数据库中所查询到的数据保留起来用来无连接的储存多个表的数据,并包含表与表之间的关联关系。 DataTable 用来存储一个表的数据 DataReader 用来顺序读取数据。因为 DataReader 在读取数据的时候限制了每次只读取一笔,而且只能只读,所以使用起来不但节省资源而且效率很好。使用 DataReader 对象除了效率较好之外,因为不用把数据全部传回,故可以降低网络的负载。 Command 用来执行 SQL 语句是否可以继承 string 类String 类是 sealed 类故不可以继承。
.net Remoting 的工作原理是什么?服务器端向客户端发送一个进程编号,一个程序域编号,以确定对象的位置。Remoting 的作用? 采用分布式进行编程的一种技术,Remoting 主要用于管理跨应用程序域的同步和异步RPC (远程过程调用协议 Remote Procedure Call protocol)会话。在默认情况下,Remoting 使用 HTTP 或 TCP 协议,并使用 XML 编码的 SOAP 或本机二进制消息格式进行通信。.NET Remoting 提供了非常灵活和可扩展的编程框架,并且他可以管理对象的状态。讲一讲你理解的 web service,在 dot net framework 中,怎么很好的结合 xml? 从表面上看,Web Service 就是一个应用程序,它向外界暴露出一个能够通过 Web 进行调用的API。这就是说,你能够用编程的方法通过 Web 调用来实现某个功能的应用程序。从深层次上看,Web Service 是一种新的 Web 应用程序分支,它们是自包含、自描述、模块化的应用,可以在网络(通常为Web)中被描述、发布、查找以及通过 Web 来调用。可扩展的标记语言 XML是 Web Service 平台中表示数据的基本格式。除了易于建立和易于分析外,XML 主要的优点在于它既与平台无关,又与厂商无关。XML 是由万维网协会(W3C)创建,W3C 制定的 XML SchemaXSD定义了一套标准的数据类型,并给出了一种语言来扩展这套数据类型。Web Service 平台是用 XSD 来作为数据类型系统的。当你用某种语言如VB.NET 或 C#来构造一个 Web Service 时,为了符合 Web Service 标准,所有你使用的数据类型都必须被转换为 XSD 类型。如想让它使用在不同平台和不同软件的不同组织间传递,还需要用某种东西将它包装起来。这种东西就是一种协议,如 SOAP。remoting 和 webservice(简述 webservice 中概念和原理) 简单的说,WS 主要是可利用 HTTP,穿透防火墙。而 Remoting 可以利用 TCP/IP,二进制传送提高效率。 1、Remoting 可以灵活的定义其所基于的协议,如果定义为 HTTP,则与 Web Service 就没有什么区别了,一般都喜欢定义为 TCP,这样比 Web Service 稍为高效一些。2、Remoting 不是标准,而 Web Service 是标准。3、Remoting 一般需要通过一个 WinForm 或是 Windows 服务进行启动,而 Web Service 则需要 IIS进行启动。4、在 VS.net 开发环境中,专门对 Web Service 的调用进行了封装,用起来比 Remoting 方便。我建议还是采用 Web Service 好些,对于开发来说更容易控制。Remoting 一般用在 C/S 的系统中,Web Service 是用在 B/S 系统中,后者还是各语言的通用接口,相同之处就是都基于 XML。为了能清楚地描述 Web Service 和 Remoting 之间得区别,我打算从他们的体系结构上来说起:Web Service 大体上分为 5 个层次:1.HTTP 传输信道2.XML 数据格式3.SOAP 封装格式4.WSDL 描述方式5.UDDI 体系框架总体上来讲,.NET 下的 Web Service 结构比较简单,也比较容易理解和应用,一般来讲在.NET 结构下的 WebService 应用都是基于.net framework 以及 IIS 的架构之下,所以部署(Dispose)起来相对比较容易点。从实现的角度来讲,首先 WebService 必须把暴露给客户端的方法所在的类继承于:System.Web.Services.WebService 这个基类;其次所暴露的方法前面必须有[WebMethod]或者[WebMethodAttribute] 。WebService 的运行机理。首先客户端从服务器的到 WebService 的 WSDL,同时在客户端声称一个代理类(Proxy Class)这个代理类负责与 WebService 服务器进行 Request 和 Response,当一个数据(XML 格式的)被封装成 SOAP 格式的数据流发送到服务器端的时候,就会生成一个进程对象并且把接收到这个 Request 的SOAP 包进行解析,然后对事物进行处理,处理结束以后再对这个计算结果进行 SOAP 包装,然后把这个包作为一个 Response 发送给客户端的代理类(Proxy Class),同样地,这个代理类也对这个 SOAP 包进行解析处理,继而进行后续操作。这就是 WebService 的一个运行过程。下面对.NET Remoting 进行概括的阐述:
.NET Remoting 是在 DCOM 等基础上发展起来的一种技术,它的主要目的是实现跨平台、跨语言、穿透企业防火墙,这也是他的基本特点,与 WebService 有所不同的是,它支持 HTTP 以及 TCP 信道,而且它不仅能传输 XML 格式的 SOAP 包,也可以传输传统意义上的二进制流,这使得它变得效率更高也更加灵活。而且它不依赖于 IIS,用户可以自己开发(Development)并部署(Dispose)自己喜欢的宿主服务器,所以从这些方面上来讲 WebService 其实上是.NET Remoting 的一种特例。1、Remoting 是 MarshByReference 的,可以传变量的引用,直接对服务器对象操作。速度快,适合Intranet(企业内部互联网)。WebService 是 MarshByValue 的,必须传对象的值。速度慢,可以过FIREWALL,配置比较简单,适合 Internet(因特网)。2、一般来说,Remoting 是和平台相关的不跨平台的,需要客户和服务器都是.NET,但可配置特性比较好,可以自定义协议。WebService 可以做到跨平台通信,但必须采用 SOAP 协议。3、 SOAP 消息有 RPC 和文档两种样式。文档样式的 body 元素中包含一个或多个元素,可以是任何内容,只要接受者理解就行了。rpc 样式的的 body 元素中包含调用的方法或远程过程的名称,以及代表方法参数的元素。 web service 数据传输有什么限制? 为什么?DataTable 可以作为 web service 参数传递么?所传输的数据必须是可序列化的。因为需要转换为 XML 格式以可以穿越防火墙,做到真正的数据共享。因为 DataSet 处理 DataTable 的序列化以便进行封送处理,所以无法传递单个 DataTable在 ADO.NET 的三个基本数据对象 — DataReader、DataTable 和 DataSet 中,只有 DataSet 可以与 Web 服务之间传递。这是因为,为了与 Web 服务进行通信,对象必须是可序列化的。(序列化是一个过程,它用于将对象的公共属性转换为 XML,并且因为 XML 只是纯文本,所以可以将其从一个应用程序传输到另一个应用程序,并且可以穿越防火墙,从而克服了 COM 的主要障碍之一。)DataReader 无法序列化,因为它们需要到服务器的开放连接。并且,因为 DataSet 处理 DataTable 的序列化以便进行封送处理,所以您也无法传递单个 DataTable。让我们研究一些示例。传递 DataSet假设我们正在运行一个订阅 Web 服务,该服务可返回所请求的有价证券在给定日期的收盘价格。用户传入用户 ID 和密码,以及他/她希望看到的有价证券和收盘价格的 DataTable。Web 服务随后验证他/她的成员身份并返回一个 DataTable,其中包含股票符号和它们的收盘价格,或者包含错误信息。 由于使用者应用程序(即,“消耗”该 Web 服务的应用程序)的开发人员需要知道股票符号和错误信息的期望结构,因此 DataSet 需要遵守您提供的发布规范。出于我们的目的,我们将假设以下条件:股票符号将存储在一个 DataTable 中,它包含三个列:一个名为 Symbol、类型为 varchar(5) 的列,一个名为 ClosingDate、类型为 datetime 的列,以及一个名为 Price、类型为 float 的列。如果在此过程中的任何时候生成错误,都将在一个只包含一列的 DataTable 中返回错误信息 — 该列的名称为 ErrorMessage,类型为 varchar(100),并且包含错误信息。通过简单地引用所返回 DataTable 的列 count,开发人员可以知道该过程是否成功。常用的调用 webservice 方法有哪些?可以从浏览器、ASP 页或其他 WEB 服务调用可以使用 HTTP-GET HTTP-POST 访问 WEB 服务也可以从ASP 页或其他 WEB 服务向其他 WEB 服务发出 SOAP 请求 HTTP-GET HTTP-POST SOAP 使用 WEB 服务代理使用 ASMX 的 XML Web 服务与使用 SOAP 的.NET Remoting 的区别?SOAP 是简单对象访问协议,Web 服务正是通过 WSDL 来约定服务器和客户端基于 xml 的 SOAP 来通讯,而无论客户端和服务器都不需要知道对方的平台、编程语言等信息。.NET Remoting 本质是为了交互更为复杂的对象,甚至需要管理远程对象的生命周期,所以客户端必须了解服务器对象的详细信息,虽然.NET Remoting 支持使用 SOAP,但对于客户端来说还是必须了解服务器对象的详细信息。Web 服务使用的消息机制,而 Remoting 采用的 RPC. Web Service 能用于不同平台,不同语言,Remoting 只适用于.Net。效率上 Remoting 高于 Xml Web Service解释一下 UDDI、WSDL 的意义及其作用。 UDDI 统一描述、发现和集成协议(UDDI, Universal Description, Discovery and Integration)是一套基于 Web 的、分布式的、为 Web 服务提供的信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的 Web 服务注册以使得别的企业能够发现的访问协议的实现标准。UDDI
提供了一组基于标准的规范用于描述和发现服务,还提供了一组基于因特网的实现。 WSDL 描述 Web 服务的公共接口。这是一个基于 XML 的关于如何与 Web 服务通讯和使用的服务描述。这是一个基于 XML 的,关于如何与 Web 服务通讯和使用的服务描述;装箱和拆箱的含义装箱:将值类型转换为引用类型。拆箱:将引用类型转换为值类型。 装箱是值类型到 object 类型或到该值类型所实现的任何接口类型的隐式转换。将一个值的值装箱会分配一个对象实例并将该值复制到新的对象中。 取消装箱是从 object 类型到值类型或从接口类型到实现该接口的值类型的显式转换。取消装箱操作包括: n 检查对象实例,确保它是给定值类型的一个装箱值。 n 将该值从实例复制到值类型变量中。 int i=0;Syste.Object obj=i; 这个过程就是装箱!就是将 i 装箱! 拆箱就是将一个引用型对象转换成任意值型!比如:int i=0;System.Object obj=i;int j=(int)obj; 这个过程前 2 句是将 i 装箱,后一句是将 obj 拆箱!再写个代码,看看进行了几次装拆箱!int i=0;System.Object obj=i;Console.WriteLine(i+","+(int)obj); 其中共发生了 3 次装箱和一次拆箱!^_^,看出来了吧?!第一次是将 i 装箱,第 2 次是输出的时候将 i 转换成 string 类型,而 string 类型为引用类型,即又是装箱,第三次装箱就是(int)obj的转换成 string 类型,装箱!拆箱就是(int)obj,将 obj 拆箱!!页面生命周期 (关于以下生命周期这部分,建议大家上网找找更详细的资料来看)页面生命周期执行一系列步骤:页面的初始化、实例化控件、还原和维护状态、运行事件处理程序代码、呈现。为了在合适的阶段执行所需的代码,所以要对页面生命周期非常熟悉。在页生命周期的各个阶段,页面会逐个引发定义的事件,通过对代码开发,在页面的生命事件中执行我们所需要的程序页生命周期阶段1、页请求:发生在页面生命周期之前,用户请求页时,ASP.NET 将确定是否需要分析和编译页,从而确定是否开始页面的生命周期,或者是否可以在不运行页的情况下发送页面缓存以进行响应。2、开始:设置页属性,如:HttpContext 以及其他属性;在此阶段,页面需要确定是回发请求还是新请求,并设置 IsPostBack 属性;设置页面的 UICulture 属性。3、页面初始化:加载所有主题;控件生成,并设置 UniqueID;注:ViewState、ControlState 中的值还未加载至控件;如果页面是回发,则回发数据也还未加载;故此时控件可以访问,但值可能出错。4、加载:如果当前请求是回发请求,则为控件加载 ViewState 和 ControlState 中的值。5、验证:调用所有验证程序控件的 Validate 方法,此方法将设置验证程序控件和页的 IsValid 属性。6、回发事件处理:如果请求是回发请求,则调用所有事件处理程序。7、呈现:首先对该页和所有控件进行保存视图状态,然后对每个控件调用 Render 方法,它会提供一个文本编写器,用于将控件的输入写入页的 Response 属性的 OutputStream 中。8、卸载:完成呈现,并已将页发送至客户端、准备丢弃该页后,调用卸载。将卸载属性如:Response 和 Request 等等。页生命周期事件:1、PreInit完成操作:检查 IsPostBack 属性来确定是不是第一次处理该页; 创建或重新创建动态控件
动态设置主控页 动态设置 Theme 属性 读取或设置配置文件属性注:如果请求是回发请求,则控件的值尚未从视图状态恢复,即:不应该在此事件中设置控件属性。2、Init完成操作:在所有控件都已经初始化并且应用所有外观设置后引发。使用该事件来读取和初始化控件属性。3、InitComplete完成操作:由 Page 对象引发,使用该事件来处理要求完成所有初始化工作的任务。4、PreLoad完成操作:为页和所有控件加载视图状态,然后处理 Request 实例包括的任何回发数据。注:如果需要在 Load 之前对页或控件进行处理,需要该事件。5、Load完成操作:以递归方式加载所有控件。6、控件事件完成操作:处理控件引发的事件。注:在回发请求中,如果页包含验证程序控件,请在执行任何处理之前检查 Page 和各个验证控件的 IsValid 属性。7、LoadComplete8、PreRender在控件输出前最后的修改机会。注:在该事件发生前的操作:Page 对所有控件递归进行 EnsureChildControl 操作设置了 DataSourceID 属性的数据绑定控件会调用 DataBind 方法。9、SaveStateComplete在该事件发生前,已经对控件的 ViewState 进行了保存。将忽略对页和控件所作的所有修改。10、Render方法,便于开发11、UnLoad大概描述一下 ASP.NET 服务器控件的生命周期初始化 加载视图状态 处理回发数据 加载 发送回发更改通知 处理回发事件 预呈现 保存状态 呈现 处置 卸载应用程序生命周期在应用程序的生命周期期间,应用程序会引发可处理的事件并调用可重写的特定方法。若要处理应用程序事件或方法,可以在应用程序根目录中创建一个名为 Global.asax 的文件。如果创建了Global.asax 文件,ASP.NET 会将其编译为从 HttpApplication 类派生的类,然后使用该派生类表示应用程序。HttpApplication 进程的一个实例每次只处理一个请求。由于在访问应用程序类中的非静态成员时不需要将其锁定,这样可以简化应用程序的事件处理过程。这样还可以将特定于请求的数据存储在应用程序类的非静态成员中。例如,可以在 Global.asax 文件中定义一个属性,然后为该属性赋一个特定于请求的值。Application_Start 和 Application_End 方法是不表示 HttpApplication 事件的特殊方法。在应用程序域的生命周期期间,ASP.NET 仅调用这些方法一次,而不是对每个 HttpApplication 实例都调用一次。asp.net 页面在什么时候产生?又在什么时候销毁? (1)Page_Init();---初始化对象这一过程主要是初始化包括页面本身的所有控件,每次的页面载入就会执行一次初试过程,而在这里面访问到的也是控件的初始值。还有就是可以通过 OnInit()来重载初试化事件 (2) LoadViewState---导入 Viewstate 数据在初试化事件后,在 loadvireState 事件中所有控件将获得他们的第一个属性 ViewState 属性,这
个属性最终将被返回给服务器以判断这个页面是已经被用户访问完毕还是仍然在被用户所访问。也可重载 loadvireState 事件对相应的控件进行值设定。 (3) Load Postback data;---用 LoadPostData 处理 Postback 数据Postback 数据也可以理解成就是服务器页面提交的表单数据,每一次表单数据的提交都会触发执行 IPostBackDataHandler 接口操作的控件。 (4) Page_Load();---导入对象这个过程就比较熟悉了,也是在页面的每次载入时一定会执行,但是注意和 PageInit()之间的区别,所有的对象第一次被布置在 DOM 页面(在 Asp.net 中称控件树)里了并且可以通过代码或是相关的位置被引用。这样,对象就可以很容易的从客户端获得诸如宽度、高度、值、可见性等在 Html 中的属性值。经常会用到的 Page.IsPostBack()指示该页是否正为响应客户端回发而加载,或者它是否正被首次加载和访问. (5) Handle control events;---具体的控件事件这个过程执行的是相应具体控件事件,比如按钮事件..等。 (6) Page_PreRender();---预先呈递对象预先呈递对象可以改变对象并将改变保存的最后时刻.可以对控件的属性、控件树的结构等做出最后的修改,同时还不用考虑 Asp.net 对其作出任何改变,因为此时已经脱离了数据库调用以及viewstate 更新了,也可以通过 OnPreRender 来重载。 (7) Page_Render();---呈递对象呈递页面所有对页面控件的修改完成后 viewstate 就被保存了。运用 Html 创建给浏览器输出的页面的时候Render 事件就发生了。在 Render 事件过程中,页面调用其中的对象将它们呈递给 Html。然后,页面就可以以 Html 的形式被用户的浏览器访问了。当 Render 事件被重载时,开发者可以编写自定义的 Html代码使得原先生成的 Html 都无效而按照新的 Html 来组织页面。 Render 方法将一个 HtmlTextWriter 对象作为参数并用它将 Html 在浏览器上以网页的形式显示。这时仍然可以做一些修改动作,不过它们只是客户端的一些变化而已了。亦可以重载 Render 事件。 (8) Unload event;---卸载对象当想服务器请求一个对象的时候,就会在内存里生成一个继承页面对象,也就是页面的类,它继承自System.Web.UI.Page.当页面对象从内存中卸载时发生,将触发该事件. (9) Dispose method called在呈递给 Html 完成后,所有的对象都应被销毁。在 Dispose 事件中,你应该销毁所有在建立这个页面时创建的对象。这时,所有的处理已经完毕,所以销毁任何剩下的对象都是不会产生错误的,包括页面对象。你可以重载 Dispose 事件。 如何部署一个 ASP.net 页面。 VS 2005 和 VS 2003 都有发布机制。2003 可以发布然后再复制部署。VS2005 基本上可以直接部署到对应位置。Session 有什么重大 BUG,微软提出了什么方法加以解决? 是 iis 中由于有进程回收机制,系统繁忙的话 Session 会丢失,可以用 Sate server 或SQL Server 数据库的方式存储 Session 不过这种方式比较慢,而且无法捕获 Session 的 END 事件。当然这种种情况是限于 MS 的 IIS 的 WEB 容器,不是每个容器都有这种问题。如何处理几十万条并发数据? 用存储过程或事务。取得最大标识的时候同时更新。注意主键不是自增量方式这种方法并发的时候是不会有重复主键的,取得最大标识要有一个存储过程来获取.谈谈 final, finally, finalize 的区别。 final(.Net 中不存在此修饰符)—修饰符(关键字)如果一个类被声明为 final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract 的,又被声明为final 的。将变量或方法声明为 final,可以保证它们在使用中不被改变。被声明为 final 的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为 final 的方法也同样只能使用,不能重载 finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。 finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除
出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。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 正确。sleep() 和 wait() 有什么区别? sleep():为当前线程指定挂起的时间,是使线程停止一段时间,在 sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非(a)"醒来"的线程具有更高的优先级 wait():释放对象上的锁,并阻塞当前线程,直到它重新获取该锁。线程交互时,如果线程对一个同步对象 x 发出一个 wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。数组有没有 length()这个方法? String 有没有 length()这个方法?数组和 string 都没有 Length()方法,只有 Length 属性。Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是 equals()? 它们有何区别? Set 里的元素是不能重复的,那么用 iterator()方法来区分重复与否。equals()是判读两个 Set 是否相等。 equals()和==方法决定引用值是否指向同一对象 equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。List, Set, Map 是否继承自 Collection 接口?List,Set 是 Map 不是abstract 的 method 是否可同时是 static,是否可同时是 native,是否可同时是 synchronized? 都不能。当一个线程进入一个对象的一个 synchronized 方法后,其它线程是否可进入此对象的其它方法? 不能,一个对象的一个 synchronized 方法只能由一个线程访问。swtich 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String 上? switch(expr1)中,expr1 是一个整型,字符或字符串,因此可以作用在 byte 和 long上,也可以作用在 string 上。 两个对象值相同(x.equals(y) == true),但却可有不同的 hash code,这句话对不对? 不对,有相同的 hash code。try {}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会不会被执行,什么时候被执行,在 return 前还是后? 会执行,在 return 前执行。构造器 Constructor 是否可被 override? 构造器 Constructor 不能被继承,因此不能重写 Overriding,但可以被重载Overloading。接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)? 接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。启动一个线程是用 run()还是 start()? 启动一个线程是调用 start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由 JVM 调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。String s = new String("xyz");创建了几个 String Object?对 JAVA 来说两个对象,一个是"xyx",一个是指向"xyx"的引用对象 s。对.NET 来说该题是错误的,根本就没这样的构造函数 String a="xyz";首先会到常量池中去查找,如果存在就不再分配,如果不存在就分配,
常量池中的数据是在编译期赋值的,也就是生成 class 文件时就把它放到常量池里了。GC 是什么? 为什么要有 GC? GC 是垃圾收集器。程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一: System.gc() Runtime.getRuntime().gc()能用 foreach 遍历访问的对象需要实现_____接口或声明_____方法的类型。IEnumerable 、 GetEnumerator。在.net 中,配件的意思是?程序集。(中间语言,源数据,资源,装配清单)什么叫应用程序域一种边界,它由公共语言运行库围绕同一应用程序范围内创建的对象建立(即,从应用程序入口点开始,沿着对象激活的序列的任何位置)。应用程序域有助于将在一个应用程序中创建的对象与在其他应用程序中创建的对象隔离,以使运行时行为可以预知。隔离正在运行的应用程序。在一个单独的进程中可以存在多个应用程序域。应用程序域可以理解为一种轻量级进程。起到安全的作用。占用资源小。就是为安全性,可靠性,隔离性,和版本控制,及卸载程序提供的隔离边界。它通常由运行库宿主创建,应用程序域提供了一个更安全,用途更广的处理单元。什么是强类型,什么是弱类型?哪种更好些?为什么? 强类型是在编译的时候就确定类型的数据,在执行时类型不能更改,而弱类型在执行的时候才会确定类型。没有好不好,二者各有好处,强类型安全,因为它事先已经确定好了,而且效率高。一般用于编译型编程语言,如 c++,java,c#,pascal 等,弱类型相比而言不安全,在运行的时候容易出现错误,但它灵活,多用于解释型编程语言,如 javascript,vb 等什么是受管制的代码?什么是强类型和弱类型系统? CTS、CLS 和 CLR 分别作何解释?(1)受管制的代码:在.NET 环境中运行的任何代码都称为受管制的代码(unmanaged code),.NET外部的其他代码也运行在 Windows 上,这些代码称为未受管制的代码(unmanaged code) 。 (2)强类型和弱类型的区别在与,在编码过程中是否要指定数据类型,作为强类型必须指定数据类型,编译器为其分配相应的存储空间(如 c ,pascal )否则编译出错。而弱类型不一定需要指定数据类型,编译器会用相同的空间去分配各种类型,除非你指定了(如 basic)。作为强类型语言,在编译阶段的安全性要高于弱语言型。 强类型系统:RTTI:类型识别系统。 (3)CLR(Common Language Runtime)的全称是公共语言运行库,读者可以把 CLR 理解为一个包含运行.NET 程序的引擎和一堆符合公共语言基础结构的类库的集合。CLR 是一个规范的实现,我们开发的几乎所有的.NET 程序都基于 CLR 的类库来实现,并且运行在 CLR 提供的运行引擎之上。所谓.NET框架,指的就是公共语言运行库。 公共语言基础(CLI)是微软公司向 ECMA 提交的一份语言和数据格式规范,CLR 是目前为止唯一一个公共语言基础的实现版本。 CTS(Common Type System)的全称是通用类型系统。前文已经介绍了公共语言基础(CLI)的概念,微软公司提交的 CLI 规范,包括了公共类型系统(CTS)、公共中间语言(CIL)、底部文件格式以及元数据格式等。公共类型系统定义了一个能够在 CLR 上运行的语言规范。尽管有很多语言本身不符合 CTS 规范,但是通过加强编译器,改变语言附加规范等手段,使得许多语言能够编写出能在 CLR 上运行的程序。 一种语言编写的程序编译能够在 CLR 上运行,并不代表这种语言本身完全符合 CTS 的规范。例如 C++语言,仍然保持了其不符合 CTS 规范的部分,并且在编译时把这部分不符合 CTS 的代码编译成原始代码而非中间代码。 CLS(Common Language Specification)的全称是通用语言规范,是 CTS 的一个子集,它定义了希望编写在.NET 平台上运行的程序的语言所需符合的最小规范。正因为.NET 允许由不同语言编写的程序一起执行,所以才制定出 CLS 规范,用以避免不同语言特性产生的错误。.net 中哪项技术(CLR、CTS、CLS)实现跨多语言?
CLRCLR 与 IL 分别是什么含义? CLR(公共语言运行库):能管理内存,能够轻松地设计其对象可以跨语言互动的组件和应用程序,编译一次,并可以在任何支持运行库的 CPU 和操作系统上运行,跨语言集成(特别是跨语言继承) 公共语言运行时,类似于 Java 中的 JVM,Java 虚拟机;在.Net 环境下,各种编程语言使用一种共同的基础资源环境,这就是 CLR,CLR 将直接与操作系统进行通信,而编程语言如 C#.NET 将尽量避免直接与操作系统直接通信,加强了程序代码的执行安全性,可以这样看:CLR 就是具体的编程语言如:C#.NET 与操作系统之间的翻译,同时它为具体的编程语言提供了许多资源。 IL(中间语言):可用于语言互操作性,IL 不是字节代码,但很接近字节代码,因此执行应用程序时,IL 到机器代码的转换要快很多。独立于 CPU 的指令集。由 CLR 转换为特定于 CPU 的代码。 IL 中间语言,也称 MSIL,微软中间语言,或 CIL,通用中间语言;所有.NET 源代码(不管用哪种语言编写)在进行编译时都被编译成 IL。在应用程序运行时被即时(Just-In-Time,JIT)编译器处理成为机器码,被解释及执行。对象能否调用静态方法对象能调用静态方法。PID 是什么?在做系统的故障排除时如何使用它? PID 是进程编号,在系统发现故障的时候,可以根据它寻找故障所发生的具体进程,并且可通过 visual studio.net 等 ide 将故障进程附加到进程中进行调试(debug)单个 TCP/IP 端口上能够被多少个进程侦听?1个描述一下 C#中索引器的实现过程,是否只能根据数字进行索引? 索引器可以使客户程序很方便地访问类中的集合或数组,类似通过索引访问数组,并且索引器向客户程序隐藏了内部的数据结构。 类似于属性,访问类或结构的集合或数组时,可以用索引器实现,索引器用 this 关键字声明,声明方法如下:数据类型 this[参数列表]{ get{ 以参数为索引返回集合或数组数据}set{ 分配值到参数索引的元素}}例:自己建立一个数组using System;class MyArray{ private string[] str = new string[5]; //定义索引器,并有可读可写属性,用 this 声明属性,接收一个整型类型参数 public string this[int i] { get { return str[i]; } set
{ str[i] = value; } } //获得数组长度 public int Length { get { return str.Length; } }}public class LxIndex{ static void Main(string[] args) { MyArray ma = new MyArray(); //给数组赋值 Console.WriteLine("给数组赋值,请输入数组元素值:"); for (int i = 0; i < ma.Length; i++) { ma[i] = Console.ReadLine(); } //输出数组中的元素 Console.WriteLine("你输入的内容是:"); for (int i = 0; i < ma.Length; i++) { Console.Write(ma[i] + " "); } }}结果:给数组赋值,请输入数组元素值:78tom**10023你输入的内容是:78 tom ** 100 23 请按任意键继续. . . 不是。索引器可以用任意类型进行索引。MVC 模式 MVC(Model View Controller)模型-视图-控制器模型负责业务领域的事情,视图负责显示的事情,控制器把数据读取出来填充模型后把模型交给视图去处理。而各种验证应该是在模型里处理了。它强制性的使应用程序的输入、处理和输出分开。MVC最大的好处是将逻辑和页面分离。Assembly.Load("foo.dll"); 这句话是否正确?错误,正确的应该是 Assembly.Load("foo"); 或者 Assembly.LoadFrom("foo.dll");DateTime 是否可以为 null?
面上有,就可以做成用户控件,但是有一个问题就是用户控件拖到不同级别的目录下后里面的图片等的相对路径会变得不准确,需要自已写方法调整。问这样的问题,一般是迷惑你。因为新手还是分不清楚用户控件和服务器控件(也称自定义控件),用户控件一般用在内容多为静态,或者少许会改变的情况下,用的比较大,类似 ASP 中的 include。。但是功能要强大的多。WEB 控件及 HTML 服务端控件能否调用客户端方法?如果能,请解释如何调用?可以调用例如:<asp:TextBox id="TextBox1" onclick="clientfunction();" runat="server"></asp:TextBox><INPUT id="Button2" value="Button" name="Button2"runat="server" onclick="clientfunction();">C#, Java 和 c++的特点,有什么相同的地方,不同的地方, C#分别从 c++和 java 中吸取了他们那些优点?C#看起来与 Java 有着惊人的相似;它包括了诸如单一继承,界面,与 Java 几乎同样的语法,和编译成中间代码再运行的过程.但是 C#与 Java 有着明显的不同,它借鉴了 Delphi 的一个特点,与 COM(组件对象模型)是直接集成。微软 c#语言定义主要是从 C 和 C++继承而来的,而且语言中的许多元素也反映了这一点.C#在设计者从 C++继承的可选选项方面比 Java 要广泛一些(比如说 structs),它还增加了自己新的特点(比方说源代码版本定义). C#从 Java 继承而来的特点 类:在 C#中类的声明与 Java 很相似。特点看起来与 Java 相比没有变化.布尔运算:条件表达式的结果是布尔数据类型,布尔数据类型是这种语言中独立的一种数据类型.从布尔类型到其他类型没有直接的转换过程.布尔常量 true 和 false 是 C#中的关键字.错误处理:如 Java 中那样,通过抛出和捕捉异常对象来管理错误处理过程.内存管理:由底层.NET 框架进行自动内存垃圾回收. C#从 C 和 C++继承的特点 编译:程序直接编译成标准的二进制可执行形式.结构体:一个 C#的结构体与 C++的结构体是相似的,因为它能够包含数据声明和方法.但是,不象 C++,C#结构体与类是不同的而且不支持继承.但是,与 Java 相同的是,一个结构体可以实现界面. 预编译:C#中存在预编译指令支持条件编译,警告,错误报告和编译行控制. #error C#独有的特点 中间代码:微软在用户选择何时 MSIL 应该编译成机器码的时候是留了很大的余地.微软公司很小心的声称 MSIL 不是解释性的,而是被编译成了机器码.它也明白许多--如果不是大多数的话--程序员认为Java 程序要不可避免的比 C 编写的任何东西都要慢.而这种实现方式决定了基于 MSIL 的程序(指的是用C#,Visual Basic,"Managed C++"--C++的一个符合 CLS 的版本--等语言编写的程序)将在性能上超过"解释性的"Java 代码.当然,这一点还需要得到事实证明,因为 C#和其他生成 MSIL 的编译器还没有发布.但是 Java JIT 编译器的普遍存在使得 Java 和 C#在性能上相对相同.象"C#是编译语言而 Java 是解释性的,"之类的声明只是商业技巧.Java 的中间代码和 MSIL 都是中间的汇编形式的语言,它们在运行时或其它的时候被编译成机器代码. 命名空间中的声明:当你创建一个程序的时候,你在一个命名空间里创建了一个或多个类.同在这个命名空间里(在类的外面)你还有可能声明界面,枚举类型和结构体.必须使用 using 关键字来引用其他命名空间的内容. 基本的数据类型:C#拥有比 C,C++或者 Java 更广泛的数据类型.这些类型是 bool, byte, ubyte, short, ushort, int, uint, long, ulong, float, double,和 decimal.象 Java 一样,所有这些类型都有一个固定的大小.又象 C 和 C++一样,每个数据类型都有有符号和无符号两种类型.与 Java 相同的是,一个字符变量包含的是一个 16 位的 Unicode 字符.C#新的数据类型是 decimal 数据类型,对于货币数据,它能存放 28 位 10 进制数字. 两个基本类:一个名叫 object 的类是所有其他类的基类.而一个名叫 string 的类也象 object 一样是这个语言的一部分.作为语言的一部分存在意味着编译器有可能使用它--无论何时你在程序中写入一句带引号的字符串,编译器会创建一个 string 对象来保存它.
不能,因为其为 Struct 类型,而结构属于值类型,值类型不能为 null,只有引用类型才能被赋值nullusing() 语法有用吗?什么是 IDisposable?它是如何实现确定性终结的有用,实现了 IDisposiable 的类在 using 中创建,using 结束后会自定调用该对象的 Dispose 方法,释放资源。不明白什么是确定性终结三层架构,用.Net 做 B/S 结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层?表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。目的即为了“高内聚,低耦合”的思想。表现层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候的所见所得。 业务逻辑层(BLL):业务层一般分为二层,业务表观层实现与表示层的沟通,业务规则层实现用户密码的安全等。表示层:为了与用户交互例如用户添加表单针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。数据访问层(DAL):该层所做事务直接操作数据库,针对数据的增添、删除、修改、更新、查找等每层之间是一种垂直的关系。三层结构是 N 层结构的一种,一般来说,层次之间是向下依赖的,下层代码未确定其接口(契约)前,上层代码是无法开发的,下层代码接口(契约)的变化将使上层的代码一起变化。优点: 分工明确,条理清晰,易于调试,而且具有可扩展性。 缺点: 增加成本。C#函数中无参数修饰符、out 修饰符、params 修饰符、ref 修饰符的区别无参数修饰符:表示按值传递out 修饰符:表示按引用传递,传递前不需赋初值,但在传入的方法内赋值,否则报错ref 修饰符:表示按引用传递,传递前必须赋初值,否则报错params 修饰符:可将不确定个数的一组相同类型的数据作为参数传递,函数签名中只能有一个params 修饰符,并且应为最后一个参数。ref 与 out 有什么不同? 方法参数上的 ref 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。若要使用 ref 参数,必须将参数作为 ref 参数显式传递到方法。ref 参数的值被传递到 ref 参数。传递到 ref 参数的参数必须最先初始化。将此方法与 out 参数相比,后者的参数在传递到 out 参数之前不必显式初始化。属性不是变量,不能作为 ref 参数传递。如果两种方法的声明仅在它们对 ref 的使用方面不同,则将出现重载。但是,无法定义仅在 ref 和 out 方面不同的重载。 方法参数上的 out 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。 当希望方法返回多个值时,声明 out 方法非常有用。使用 out 参数的方法仍然可以返回一个值。一个方法可以有一个以上的 out 参数。若要使用 out 参数,必须将参数作为 out 参数显式传递到方法。out 参数的值不会传递到 out 参数。不必初始化作为 out 参数传递的变量。然而,必须在方法返回之前为 out 参数赋值。属性不是变量,不能作为 out 参数传递。如果两个方法的声明仅在 out 的使用方面不同,则会发生重载。不过,无法定义仅在 ref 和 out 方面不同的重载。extern 是什么意思?extern 修饰符用于声明由程序集外部实现的成员函数,经常用于系统 API 函数的调用(通过 DllImport )。注意,和 DllImport 一起使用时要加上 static 修饰符也可以用于对于同一程序集不同版本组件的调用(用 extern 声明别名)不能与 abstract 修饰符同时使用using System.Runtime.InteropServices;using System;namespace TestExtern{ class ClassHello
{ //extern 与 DllImport 一起使用时必须再加上一个 static 修饰符 [DllImport("User32.dll")] public static extern int MessageBox(int Handle, string Message, string Caption, int Type); static void Main() { string myString; Console.Write("请输入提示信息: "); myString = Console.ReadLine(); MessageBox(0, myString, "我的测试", 0); } }}结果:对象构造器 使用对象构造器,可以使初始化对象像初始化数组一样简单,即在构造函数后直接添加多个初始化语句代码,并用逗号分隔,整体用{}括起来,定义形式如下: 类型声明 实例名称 = new 类型名称() {初始化语句 1,初始化语句 2}; 如果相同成员的不同初始化语句,则以最右面的语句为准。初始化的顺序是先执行构造函数的语句,然后执行对象构造器中的语句。如下例:Snake s = new Snake () {name="眼镜蛇",length=12,weight=20};C#匿名类型的的实际应用 通过 var 和对象构造器,声明一个没有名称(其名称是由编译器分配的)的类,同时创建并初始化成员。如:var pc1 = new {cpu="Intel",memory="AMD"};如果程序仅仅需要临时一组数据,则用匿名类型比较合适,匿名类型编译后,仍然是一个普通的密封类,不可派生其他类,只是名称是由编译器分配的,利用对象构造器初始化的成员,具有只读属性。匿名内部类同样有构造函数用于初始化成员,只是创建时不需要显式调用。如下列:const 和 readonly 区别都可以标识一个常量。主要有以下区别:1、初始化位置不同。const 必须在声明的同时赋值;readonly 即可以在声明处赋值,也可以在静态构造方法(必须是静态构造方法,普通构造方法不行)里赋值。2、修饰对象不同。const 即可以修饰类的字段,也可以修饰局部变量;readonly 只能修饰类的字段3、const 是编译时常量,在编译时确定该值;readonly 是运行时常量,在运行时确定该值。4、const 默认是静态的;而 readonly 如果设置成静态需要显示声明5、修饰引用类型时不同,const 只能修饰 string 或值为 null 的其他引用类型;readonly 可以是任何类型。如果类型限制了不能在编译时确定它的值,可以使用 static readonly 来代替。请解释 virtual 的含义? virtual 关键字用于修改方法或属性的声明,在这种情况下,方法或属性被称作虚拟成员。虚拟成员的实现可由派生类中的重写成员更改。 调用虚方法时,将为重写成员检查该对象的运行时类型。将调用大部分派生类中的该重写成员,如果没有派生类重写该成员,则它可能是原始成员。默认情况下,方法是非虚拟的。不能重写非虚方法。不能将 virtual 修饰符与以下修饰符一起使用:static abstract override 除了声明和调用语法不同外,虚拟属性的行为与抽象方法一样。 在静态属性上使用 virtual 修饰符是错误的。 通过包括使用 override 修饰符的属性声明,可在派生类中重写虚拟继承属性sealed、new、virtual、abstract 与 override 关键字的区别sealed 修饰类代表密封类,不能被继承,修饰方法代表密封方法,不能被重写。通常用于实现第
三方类库时不想被客户端继承,或用于没有必要再继承的类以防止滥用继承造成层次结构混乱new 显式隐藏基类的成员。不用 new 隐藏基类的成员也可以,但会给出警告。virtual 为了子类来重写的,子类需要 override,如果不用会给个警告abstract 可以修饰类,方法,属性,索引器及事件。override 子类重写基类的 abstract,virtual 成员,。不能重写非虚拟方法或静态方法new 和 override 相同点和区别相同点:都可以对基类成员进行隐藏,都可以用 base 调用基类的成员不同点:1、用 override 重写基类的方法,要求与基类必须有完全相同的访问修饰符、返回值类型和方法名称名称,参数,异常。new 不用2、用 override 重写基类的方法,要求基类的方法必须为虚拟的,抽象的或重写的(virtual,abstract,override),而 new 不必要3、继承后,用一个基类的对象调用基类的 virtual 方法时,override 重写的子类方法会被访问,而 new 重写的子类方法不会被访问(只访问基类的 virtual 方法)4、new 作为运算符时,创建对象,调用构造函数。new 用于约束时 用于在泛型声明中,约束指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数。例using System;public class BaseClass{ public BaseClass() { Console.WriteLine(" 基类构造"); } //使用 virtual 才可以在子类中使用 override,而 new 不必要 public virtual void Method() { Console.WriteLine(" 基类.Method()"); }}public class ClassA : BaseClass{ public ClassA() { Console.WriteLine(" 类 A.构造"); } public override void Method() { //base.Method(); Console.WriteLine(" 类 A.Method() in override"); }}public class ClassB : BaseClass{ public ClassB() { Console.WriteLine(" 类 B.构造"); } public new void Method() {
//base.Method(); Console.WriteLine(" 类 B.Method() in new"); }}class Program{ static void Main(string[] args) { BaseClass ba1 = (BaseClass)new ClassA();//类型转换 //用 override 重写方法,是基类的一个派生, //所以这里通过基类的虚函数,会访问到派生类的方法。 ba1.Method(); Console.WriteLine(" ================="); BaseClass bb2 = (BaseClass)new ClassB();//类型转换 //用 new 重写方法,是一个和基类无关的新方法, //所以这里基类调用的时候,访问基类的方法。 bb2.Method(); Console.WriteLine(" ================="); ClassA a1 = new ClassA(); a1.Method(); Console.WriteLine(" ================="); ClassB b2 = new ClassB(); b2.Method(); Console.WriteLine(" ================="); Console.ReadKey(); }}运行结果:基类构造类 A.构造类 A.Method() in override=================基类构造类 B.构造基类.Method()=================基类构造类 A.构造类 A.Method() in override=================基类构造类 B.构造类 B.Method() in new=================Web.config 配置 Windows 身份认证 您需要创建一个 ASP.NET 应用程序,公司考虑使用 Windows 身份认证。所有的用户都存在于 AllWin 这个域中。您想要使用下列认证规则来配置这个应用程序:1 匿名用户不允许访问这个应用程序。2 所有雇员除了 Tess 和 King 都允许访问这个应用程序。请问您应该使用哪一个代码段来配置这个应用程序?<authorization>
<allow users="*"> <deny users="allwin\tess, allwin\king"> <deny users="?"></authorization>Global.asax 文件中配置自定义的错误 问:您要创建 ASP.NET 应用程序用于运行 AllWin 公司内部的 Web 站点,这个应用程序包含了 50 个页面。您想要配置这个应用程序以便当发生一个 HTTP 代码错误时它可以显示一个自定义的错误页面给用户。您想要花最小的代价完成这些目标,您应该怎么做? 答:在这个应用程序的 Global.asax 文件中创建一个 Application_Error 过程去处理ASP.NET 代码错误。在 DataGrid 控件的 Footer 显示员工合计数 问:您要创建一个显示公司员工列表的应用程序。您使用一个 DataGrid 控件显示员工的列表。您打算修改这个控件以便在这个 Grid 的 Footer 显示员工合计数。请问您应该怎么做? 答:重写 OnItemCreated 事件,当 Grid 的 Footer 行被创建时显示合计数。如何在这个程序中使用 Web Service 问:您为 AllWin 公司创建了一个 ASP.NET 应用程序。这个应用程序调用一个 Xml Web Service。这个 Xml Web Service 将返回一个包含了公司雇员列表的 DataSet 对象。请问您该如何在这个程序中使用这个 Xml Web Service?---答: 答:在“Web 引用”对话框中输入这个 XML Web service 的地址。修改程序 问:您要创建一个 ASP.NET 应用程序在 DataGrid 控件中显示一个经过排序的列表。产品数据被存放于一个名为 PubBase 的 Microsoft SQL Server 数据库。每个产品的主键是ProductID,Numeric 型并且每个产品有一个字母描述字段,名为 ProductName。您使用一个SqlDataAdapter 对象和一个 SqlCommand 对象通过调用一个存储过程从数据库中获取产品数据。您将SqlCommand 对象的 CommandType 属性设置为 CommandType.StoredProcedure,并将它的 CommandText 属性设置为 procProductList。您成功的获取了一个 DataTable 对象,其中是已经按 ProductID 降序排列的产品列表。您打算显示以相反的字母顺序排列的 ProductName,请问该怎么做? 答:将 SqlCommand 对象的 CommandType 属性修改为 CommandType.Text,将 CommandText属性修改为”SELECT * FROM procProductList ORDER BY ProductName DESC”。然后将这个DataTable 对象绑定到 DataGrid 控件。货币的值如何按各个不同国家的习惯来输出 问:在 C#中有一个 double 型的变量,比如 10321.5,比如 122235401.21644,作为货币的值如何按各个不同国家的习惯来输出。比如美国用$10,321.50 和$122,235,401.22 而在英国则为£10 321.50 和£122 235 401.22。using System;using System.Globalization;class Program{ static void Main(string[] args) { //CultureInfo 类呈现区域性特定的信息,如关联的语言、子语言、国家/地区、日历和区域性约定。 System.Globalization.CultureInfo myCultureUS = new System.Globalization.CultureInfo("en-US"); CultureInfo myCultureEN = new CultureInfo("en-GB"); CultureInfo myCultureCN = new CultureInfo("zh-CN"); double x = 10321.5, y = 122235401.21644; string str = String.Format(myCultureUS, "My amount={0:c}(美国)", y); Console.WriteLine(str); str = String.Format(myCultureEN, "My amount={0:c}(英国)", y);
Console.WriteLine(str); str = String.Format(myCultureCN, "My amount={0:c}(中国)", y); Console.WriteLine(str); }}结果:My amount=$122,235,401.22(美国)My amount=£122,235,401.22(英国)My amount=¥122,235,401.22(中国)请按任意键继续. . .error 和 exception 有什么区别? error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。 exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。要用新浪网上的天气预报,怎么办?用 webservice,请求国家气象局的接口。用 ajax 把新浪网上的网页请求过来,然后解析一下。母板页与内容页中怎么传参(除Session、Cookie、Application、QuerySting、this.Server.Transfer 之外)?获取母版页上文本框的值赋给内容页的文本框this.TextBox1.Text = (Master.FindControl("textBox1") as TextBox).Text;获取内容页上文本框的值赋给母版页的文本框TextBox1.Text = (this.ContentPlaceHolder1.FindControl("textBox1") as TextBox).Text;两根分布不均匀的香,全部烧完需 1 个小时,如何确定一段 15 分钟的时间?同时点燃第一根的两端和第二根的一端,第一根烧完是半个小时,这时点燃第二根的另一端并开始计时,全部烧完就是 15 分钟。Xml 文档定义的形式?它们的本质区别?解析 Xml 文档的方式?a: 两种形式 dtd schema;b: 本质区别:schema 本身是 xml 的,可以被 XML 解析器解析(这也是从DTD 上发展 schema 的根本目的);c:有 DOM,SAX,STAX 等。DOM:处理大型文件时其性能下降的非常厉害。这个问题是由 DOM 的树结构所造成的,这种结构占用的内存较多,而且 DOM 必须在解析文件之前把整个文档装入内存,适合对 XML 的随机访问。SAX:不现于 DOM,SAX 是事件驱动型的 XML 解析方式。它顺序读取 XML 文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理 XML 文件,适合对 XML 的顺序访问。STAX:Streaming API for XML(流的 API 的 XML) (StAX)。.在.net(C# or vb.net)中如何取消一个窗体的关闭。private void Form1_FormClosing(object sender, FormClosingEventArgs e){ e.Cancel = true;}在.net(C# or vb.net)中,Appplication.Exit 还是 Form.Close 有什么不同?一个是退出整个应用程序,一个是关闭其中一个 form。62-63=1 等式不成立,请移动一个数字(不可以移动减号和等于号),使得等式成立,如何移动?62 移动成 2 的 6 次方获得枚举中的常数名称和常数值通过 Enum.GetNames(typeof(枚举))获得枚举名称,Enum.GetValues(typeof(枚举))获得枚举常数值例如:对于这样的一个枚举类型using System;using System.Globalization;class Program
{ enum Color : byte { Red, Green, Blue, Orange } static void Main(string[] args) { string[] sa = Enum.GetNames(typeof(Color)); // Red, Green, Blue, Orange Console.WriteLine("枚举中的常数名称:"); foreach (string s in sa) Console.Write(s + "\t"); Console.WriteLine(); byte[] sb = (byte[])Enum.GetValues(typeof(Color)); // 0,1,2,3 Console.WriteLine("枚举中的常数值:"); foreach (byte s in sb) Console.Write(s + "\t"); Console.WriteLine(); }}结果:枚举中的常数名称:Red Green Blue Orange枚举中的常数值:0 1 2 3请按任意键继续. . .Anonymous Inner Class (匿名内部类) 是否可以 extends(继承)其它类,是否可以 implements(实现)interface(接口)? 不能,可以实现接口Static Nested Class 和 Inner Class 的不同,说得越多越好 Static Nested Class 是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化。HashMap 和 Hashtable 的区别。 HashMap 是 Hashtable 的轻量级实现(非线程安全的实现),他们都完成了 Map 接口,主要区别在于 HashMap 允许空(null)键值(key),由于非线程安全,效率上可能高于 Hashtable.分析以下代码。 public static void test(string ConnectString) { System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection(); conn.ConnectionString = ConnectString; try { conn.Open(); //…… } catch (Exception Ex) { MessageBox.Show(Ex.ToString()); } finally { if (!conn.State.Equals(ConnectionState.Closed))conn.Close();
}}1)以上代码可以正确使用连接池吗? 如果传入的 connectionString 是一模一样的话,可以正确使用连接池。不过一模一样的意思是,连字符的空格数,顺序完全一致。 2)以上代码所使用的异常处理方法,是否所有在 test 方法内的异常都可以被捕捉并显示出来? 只可以捕捉数据库连接中的异常吧. (finally 中,catch 中,如果有别的可能引发异常的操作,也应该用 try,catch。所以理论上并非所有异常都会被捕捉。)什么是 WSE?目前最新的版 本是多少? WSE (Web Service Extension) 包来提供最新的 WEB 服务安全保证,目前最新版本 2.0。请谈谈对正则表达式? 能将一些比较复杂的验证逻辑以简单的验证表达式验证.请解释 web.config 文件中的重要节点动态调试编译--<compilation/>,自定义错误信息--<customErrors/>,身份验证—<authentication/>,授权--<authorization/>,应用程序级别跟踪记录--<trace/>,会话状态设置--<sessionState/>,全球化--<globalization/>请解释 ASP.NET 中的 web 页面与其隐藏类之间的关系? 一个 ASP.NET 页面一般都对应一个隐藏类,一般都在 ASP.NET 页面的声明中指定了隐藏类例如一个页面 Tst1.aspx 的页面声明如下:<%@ Page language="c#" Codebehind="Tst1.aspx.cs" AutoEventWireup="false" Inherits="T1.Tst1" %>Codebehind="Tst1.aspx.cs" 表明经编译此页面时使用哪一个代码文件Inherits="T1.Tst1" 表用运行时使用哪一个隐藏类当发现不能读取页面上的输入的数据时很有可能是什么原因造成的?怎么解决很有可能是在 Page_Load 中数据处理时没有进行 Page 的 IsPostBack 属性判断请解释什么是上下文对象,在什么情况下要使用上下文对象 上下文对象是指 HttpContext 类的 Current 属性,当我们在一个普通类中要访问内置对象(Response,Request,Session,Server,Appliction 等)时就要以使用此对象某一密码仅使用 K、L、M、N、O 共 5 个字母,密码中的单词从左向右排列,密码单词必须遵循如下规则:(1)密码单词的最小长度是两个字母,可以相同,也可以不同 (2)K 不可能是单词的第一个字母 (3)如果 L 出现,则出现次数不止一次 (4)M 不能使最后一个也不能是倒数第二个字母 (5)K 出现,则 N 就一定出现 (6)O 如果是最后一个字母,则 L 一定出现 问题一:下列哪一个字母可以放在 LO 中的 O 后面,形成一个 3 个字母的密码单词?答案:B A) K B)L C) M D) N 问题二:如果能得到的字母是 K、L、M,那么能够形成的两个字母长的密码单词的总数是多少?答案:A A)1 个 B)3 个 C)6 个 D)9 个 问题三:下列哪一个是单词密码?答案: C A) KLLN B) LOML C) MLLO D)NMKO 请解释流与文件有什么不同? 文件是一些具有永久存储及特定顺序的字节组成的一个有序的、具有名称的集合。因此,对于文件,人们常会想到目录路径、磁盘存储、文件和目录名等方面。相反,流提供一种向后备存储器写入字节和从后备存储器读取字节的方式,后备存储器可以为多种存储媒介之一。正如除磁盘外存在多种后备存储器一样,除文件流之外也存在多种流。例如,还存在网络流、内存流和磁带流等。类型系统是由 XMLSchema 表示的吗?CLS 是 XMLSchema 表示的吗?问题的翻译,Are the type system represented by XmlSchema and the CLS isomorphic?我觉得
问题是这样的,XMLSchema 和 CLS 的类型系统相似吗?XmlSchema 是一个特定的 XML 文档,必须满足的一套标准。这些标准能够描述不同的数据类型。比如:xs:BooleanCLS 不管值类型还是引用类型都是一套类型系统,比如 System.Boolean.像不像?你说呢?从概念上阐述前期绑定(early-binding)和后期绑定(late-binding)的区别?如果方法在编译时就确定就是前期绑定,如果在运行时确定的叫后期绑定。这个就像是强弱类型的比较相似,前期绑定是在编译的时候就确定了要绑定的数据,而后期绑定是在运行的时候才填充数据。所以前期绑定如果失败,会在编译时报编译错误,而后期绑定失败只有在运行时的时候才发生举个例子,比如 spring 在运行时才取类和类的对象,就是后期绑定调用 Assembly.Load 算静态引用还是动态引用?个人理解其实应该是一个反射,System.Reflection.Assembly.Load.所以嘛肯定动态引用了。因为静态引用在编译时就已经引用,并使用。何时使用 Assembly.LoadFrom?何时使用 Assembly.LoadFile?(声明以下是抄的,我不太了解 Assembly.LoadFrom)。区别如下:1、Assembly.LoadFile 只载入相应的 dll 文件,不载入相应 dll 内引用的其他 dll,比如Assembly.LoadFile("a.dll"),则载入 a.dll,假如 a.dll 中引用了 b.dll 的话,b.dll 并不会被载入。Assembly.LoadFrom 则不一样,它会载入相应的 dll 文件及其引用的其他 dll,比如上面的例子,b.dll 也会被载入。2、用 Assembly.LoadFrom 载入一个 Assembly 时,会先检查前面是否已经载入过相同名字的Assembly,比如 a.dll 有两个版本(版本 1 在目录 1 下,版本 2 放在目录 2 下),程序一开始时载入了版本 1,当使用 Assembly.LoadFrom("2\\a.dll")载入版本 2 时,不能载入,而是返回版本 1。Assembly.LoadFile 的话则不会做这样的检查,比如上面的例子换成 Assembly.LoadFile 的话,则能正确载入版本 2。什么叫 Assembly Qualified Name?它是一个文件名吗?它有什么不同?它不是一个文件名,相比文件名,Assembly Qualified Name(程序集限定名称),更能确定一个程序集,它包含文件名,但同时包含版本,公钥,和区域。因为同样一个名称的文件可能有不同的版本和区域,此时单独靠文件名称,可能会造成不能确定程序集的正确性。做强签名的 assembly 与不做强签名的 assembly 有什么不同?强签名的程序集可以确认 assembly name 是唯一的(因为使用了 public key token)。强签名的程序集可以做成 com。强签名程序集可以安装到 GAC 中。DateTime 是否可以为 null?不能为 null,包括 int 什么的都不能等于 null。当然 2.0 可以里加可空类型,但是在编译后你会发现可空类型其实是假的。什么叫 JIT?什么是 NGEN?它们分别有什么限制和好处?.NET 采用中间语言(IL)机制。JIT(Just In Time)即时编译是指程序第一次运行的时候才进行把中间语言(IL)编译成机器代码,JIT 增加了执行效率。本机映像生成器 (Ngen.exe) 是一个提高托管应用程序性能的工具。Ngen.exe 创建本机映像(包含经编译的特定于处理器的机器代码的文件),并将它们安装到本地计算机上的本机映像缓存中。运行库可从缓存中使用本机映像,而不是使用实时 (JIT) 编译器编译原始程序集。这是为什么 asp.net 程序第一次会比较慢,因为他是 JIT。.NET CLR 中一代的垃圾收集器是如何管理对象的生命周期的?什么叫非确定性终结?垃圾收集器不能管理对象的生命周期吧??我认为他只能跟踪对象的生命周期先看一个对象的生命周期1. 调用 IL 的 newobj 指令,分配一定空间的内存。2. 初始化内存空间,比如设置为 string 类型。3. 使用对象。4. 销毁对象,执行清理5. 回收内存
垃圾收集是在第 4 步。有三种方法:Finalize、Dispose、Close。但垃圾收集执行的时机不定的,初学者可以认为对象销毁的时机是在垃圾收集器认为对象需要被销毁的时候进行的,他对于程序员是透明的,初学者根本不需要知道垃圾收集器的存在。个人理解的垃圾收集器的执行原理周期性地遍历被应用当前引用的所有对象的列表。在这个搜索过程中,凡是没有发现的对象,都将准备予以销毁(但不并不是马上就销毁,只是先标记)。这种算法表示如果对象的最后一个引用也被解除时(意思是该对象再也不使用了,即可以销毁了),这时垃圾收集器并不会立即接到通知,只有下一次对堆(heap)进行清扫时,才能发现这个情况。 说明了对象在什么时候终结是不确定的,我认为这就是非确定性终结。进一步而言,执行垃圾收集清扫次数越少,这类算法工作得越好。通常来说,堆的耗尽是收集清扫的触发条件。 Finalize()和 Dispose()之间的区别?Finalize 自动释放资源,Dispose()用于手动释放资源。一. FinalizeFinalize 很像 C++的析构函数,我们在代码中的实现形式为这与 C++的析构函数在形式上完全一样,但它的调用过程却大不相同。~ClassName() {//释放你的非托管资源}比如类 A 中实现了 Finalize 函数,在 A 的一个对象 a 被创建时(准确的说应该是构造函数被调用之前),它的指针被插入到一个 finalization 链表中;在 GC 运行时,它将查找 finalization 链表中的对象指针,如果此时 a 已经是垃圾对象的话,它会被移入一个 freachable 队列中,最后 GC 会调用一个高优先级线程,这个线程专门负责遍历 freachable 队列并调用队列中所有对象的 Finalize 方法,至此,对象 a 中的非托管资源才得到了释放(当然前提是你正确实现了它的 Finalize 方法),而 a 所占用的内存资源则必需等到下一次 GC 才能得到释放,所以一个实现了 Finalize 方法的对象必需等两次 GC 才能被完全释放。由于 Finalize 是由 GC 负责调用,所以可以说是一种自动的释放方式。但是这里面要注意两个问题:第一,由于无法确定 GC 何时会运作,因此可能很长的一段时间里对象的资源都没有得到释放,这对于一些关键资源而言是非常要命的。第二,由于负责调用 Finalize 的线程并不保证各个对象的 Finalize的调用顺序,这可能会带来微妙的依赖性问题。如果你在对象 a 的 Finalize 中引用了对象 b,而 a 和 b两者都实现了 Finalize,那么如果 b 的 Finalize 先被调用的话,随后在调用 a 的 Finalize 时就会出现问题,因为它引用了一个已经被释放的资源。因此,在 Finalize 方法中应该尽量避免引用其他实现了Finalize 方法的对象。可见,这种“自动”释放资源的方法并不能满足我们的需要,因为我们不能显示的调用它(只能由GC 调用),而且会产生依赖型问题。我们需要更准确的控制资源的释放。二. DisposeDispose 是提供给我们显示调用的方法。由于对 Dispose 的实现很容易出现问题,所以在一些书籍上(如《Effective C#》和《Applied Microsoft.Net Framework Programming》)给出了一个特定的实现模式:using System;using System.Globalization;class DisposePattern :IDisposable{ private System.IO.FileStream fs = new System.IO.FileStream("test.txt", System.IO.FileMode.Create); //析构函数 ~DisposePattern() { Dispose(false); } //IDisposable Members #region IDisposable Members public void Dispose() {
参数传递:方法可以被声明接受可变数目的参数.缺省的参数传递方法是对基本数据类型进行值传递.ref 关键字可以用来强迫一个变量通过引用传递,这使得一个变量可以接受一个返回值.out 关键字也能声明引用传递过程,与 ref 不同的地方是,它指明这个参数并不需要初始值. 与 COM 的集成:C#对 Windows 程序最大的卖点可能就是它与 COM 的无缝集成了,COM 就是微软的Win32 组件技术.实际上,最终有可能在任何.NET 语言里编写 COM 客户和服务器端.C#编写的类可以子类化一个以存在的 COM 组件;生成的类也能被作为一个 COM 组件使用,然后又能使用,比方说, JScript 语言子类化它从而得到第三个 COM 组件.这种现象的结果是导致了一个运行环境的产生,在这个环境里的组件是网络服务,可用用任何.NET 语言子类化. 索引下标:一个索引与属性除了不使用属性名来引用类成员而是用一个方括号中的数字来匿名引用(就象用数组下标一样)以外是相似的. 代理和反馈:一个代理对象包括了访问一个特定对象的特定方法所需的信息.只要把它当成一个聪明的方法指针就行了.代理对象可以被移动到另一个地方,然后可以通过访问它来对已存在的方法进行类型安全的调用.一个反馈方法是代理的特例.event 关键字用在将在事件发生的时候被当成代理调用的方法声明中. 在 C#中,string str = null 与 string str = “”的区别。string str = null 是不给他分配内存空间,而 string str = ""给它分配长度为空字符串的内存空怎样理解静态变量?静态成员和非静态成员的区别?静态变量属于类,而不属于对象;并对所有对象所享;静态成员在加类的时候就被加载。静态成员和非静态成员的区别? 静态变量使用 static 修饰符进行声明,静态成员在加类的时候就被加载(在类被实例化时创建,哪个对),通过类进行访问 不带有 static 修饰符声明的变量称做非静态变量,在对象被实例化时创建,通过对象进行访问 一个类的所有实例的同一静态变量都是同一个值,同一个类的不同实例的同一非静态变量可以是不同的值 静态函数的实现里不能使用非静态成员,如非静态变量、非静态函数等DataReader 和 DataSet 的异同DataReader 和 DataSet 最大的区别在于,DataReader 使用时始终占用 SqlConnection,在线操作数据库,任何对 SqlConnection 的操作都会引发 DataReader 的异常,因为 DataReader 每次只在内存中加载一条数据,所以占用的内存是很小的,因为 DataReader 的特殊性和高性能。所以 DataReader 是只进的,你读了第一条后就不能再去读取第一条了。DataSet 则是将数据一次性加载在内存中。抛弃数据库连接,读取完毕即放弃数据库连接,因为DataSet 将数据全部加载在内存中。所以比较消耗内存,但是确比 DataReader 要灵活,可以动态的添加行,列,数据。对数据库进行回传更新操作。简述静态类和静态成员 静态类中的成员都必须是静态的。静态类无构造方法,并且是密封类无法被继承。 静态成员访问时只能通过类名来访问,不能通过对象访问(和 JAVA 有区别),this 也无法访问静态成员。描述接口的作用充当类的功能界面,接口里的成员属于抽象描述,必须通过类的实现才能使用。如:某个项目有多个模块组成,每个模块由一个开发者完成,开发者只需编写完模块功能实现后,留下的接口供其他人使用。其他人在程序中,使用接口时,只需知道接口的功能,不了解如何实现。当功能模块无法满足需要或功能模块的需求变更时,程序员只需将该功能模块的实现代码进行修改和扩充,而其他调用接口的程序无须改动。接口的这种应用模式成为 brige 模式(即意图和实现分离)接口反映了面向对象的多态特征,即通过相同方法得到不同实现。接口也反映了面向对象的封装特征,使用者可以不清楚接口成员的实现细节。注意:因为接口成员默认的访问权限是 public,所以在实现接口时,类的成员必须为 public,且方法名和参数必须一致。
//告诉 GC 不需要再调用 Finalize 方法, //因为资源已经被显示清理 GC.SuppressFinalize(this); Dispose(true); } #endregion protected virtual void Dispose(bool disposing) { //由于 Dispose 方法可能被多线程调用, //所以加锁以确保线程安全 lock (this) { if (disposing) { //说明对象的 Finalize 方法并没有被执行, //在这里可以安全的引用其他实现了 Finalize 方法的对象 } if (fs != null) { fs.Dispose(); fs = null; //标识资源已经清理,避免多次释放 } } }}在注释中已经有了比较清楚的描述,另外还有一点需要说明:如果 DisposePattern 类是派生自基类 B,而 B 是一个实现了 Dispose 的类,那么 DisposePattern 中只需要 override 基类 B 的带参的Dispose 方法即可,而不需要重写无参的 Dispose 和 Finalize 方法,此时 Dispose 的实现为:class DerivedClass : DisposePattern{ protected override void Dispose(bool disposing) { lock (this) { try { //清理自己的非托管资源, //实现模式与 DisposePattern 相同 } finally { base.Dispose(disposing); } } }}当然,如果 DerivedClass 本身没有什么资源需要清理,那么就不需要重写 Dispose 方法了,正如我们平时做的一些对话框,虽然都是继承于 System.Windows.Forms.Form,但我们常常不需要去重写基类 Form 的 Dispose 方法,因为本身没有什么非托管的咚咚需要释放。了解 GC 的脾性在很多时候是非常必要的,起码在出现资源泄漏问题的时候你不至于手足无措。我
写过一个生成 excel 报表的控件,其中对 excel 对象的释放就让我忙活了一阵。如果你做过 excel 开发的话,可能也遇到过结束 excel 进程之类的问题,特别是包装成一个供别人调用的库时,何时释放excel 对象以确保进程结束是一个关键问题。当然,GC 的内部机制非常复杂,还有许多内容可挖,但了解所有细节的成本太高,只需了解基础,够用就好。using() 语法有用吗?什么是 IDisposable?它是如何实现确定性终结的。using()能自动调用 Dispose 方法比如:using()会自动调用 MyObject 的 Dispose 方法using ( MyObject myObject = new MyObject ( ) ){ Console.WriteLine ( "quit" ) ;}IDisposiable 是显示释放对象的接口,实现 IDisposiable 接口的类,可以显示的释放对象。通过编写 Dispose 方法来实现显式释放资源;// C#class MyClass : IDisposable{ // 构造函数 public MyClass() { } // 析构方法 (不确定的) (编译器通过重载 virtual void Finalize 来实现),与 C++/CLI 的!MyClass()等效 ~MyClass() { } // Dispose 方法 public void Dispose() { } public static void Test() { using (MyClass auto = new MyClass()) { } // 因为使用了 using 句法,编译器自动调用 auto.Dispose() // 以上代码等效于: MyClass user = new MyClass(); try { } finally { user.Dispose(); } }}tasklist /m "mscor*" 这句命令是干嘛的?列出所有使用了以" mscor"作为开头的 dll 或者 exe 的进程和模块信息in-proc 和 out-of-proc 的区别in-proc 是进程内,进程内能共享代码和数据块,out-of-proc 是进程外,进程外的互操作需要用进程间通讯来实现。.NET 里的哪一项技术能够实现 out-of-proc 通讯?.Net Remoting 技术或者 WCF 技术当你在 ASP.NET 中运行一个组件时,它在 Windows XP, Windows 2000, Windows 2003 上分别跑在哪个进程里面?Xp : aspnet_Wp.exe
Windows 2000 : inetinfo.exeWindows 2003 : w3wp.exe在.Net 中所有可序列化的类都被标记为什么?[serializable]DateTime.Parse(myString); 这行代码有什么问题? 有问题,当 myString 不能满足时间格式要求的时候,会引发异常,建议使用DateTime.TryParse() PDB 是什么东西? 在调试中它应该放在哪里? PDB 是用于保存调试和项目状态信息的文件,在 debug 的时候将产生 pdb 文件,调试的时候应该放在和对应应用程序集相同目录。 什么叫圈复杂度(cyclomatic complexity)?为什么它很重要? 不知道,望指教 ? 写一个标准的 lock(),在访问变量的前后创建临界区,要有"双重检查",lock 的使用 public void LockTest() { Object lockObj = new Object(); lock (lockObj) { // } }什么叫 FullTrust?放入 GAC 的 assembly 是否是 FullTrust 的? FullTrust 完全信任。放入 GAC 中的 Assembly 是否 FullTrust 我的理解不是。我理解FullTrust 是可以通过代码设定的 代码加上需要安全权限的特性有什么好处? 可以更加灵活的设置对代码的访问权限,实现代码级保护。这点不是特清楚,有明白的给讲解下 gacutil /l | find /i "Corillian" 这句命令的作用是什么? 全局程序集缓存中如果有 Corillian 就更新该程序集,没有就安装 sn -t foo.dll 这句命令是干嘛的? 显示程序集 foo.dll 的公钥标记 DCOM 需要防火墙打开哪些端口?端口 135 是干嘛用的? 135 端口,因为 DCOM 的端口号是随机分配的,默认情况下,会分配 1024 以上的端口号,所以默认情况下,DCOM 不能穿越防火墙。因为根本不晓得开哪个端口。但有解决办法可以使 DCOM 分配的端口号固定, 有关内容我在 http://www.cnblogs.com/jillzhang/archive/2008/02/20/1075057.html有过一些描述。135 是远程过程调用(RPC)的默认端口 对比 OOP 和 SOA,它们的目的分别是什么? 我想 OOP 和 SOA 应该没有对比性吧。OOP 是一种编程模型,强调将复杂的逻辑分解出小的模块,特性是继承,封装和多态 。而 SOA 是一个技术框架,技术框架和编程模型应该说不是一码事吧?SOA 的思想是将业务逻辑封装成服务或者中间件提供给应用程序来调用,当然其组件化思想是继承和发扬了 OOP 的优点。 XmlSerializer 是如何工作的?使用这个类的进程需要什么 ACL 权限? 我只知道 XmlSerializer 是将对象的属性和字段进行序列化和反序列化的,序列化成为xml 数据,反序列化再将 xml 转换成对象。应该至少需要 ACL 权限中的读权限. ACL(access control list) 访问控制表 ACL 是存在于计算机中的一张表,它使操作系统明白每个用户对特定系统对象,例如文件目录或单个文件的存取权限。每个对象拥有一个在访问控制表中定义的安全属性。这张表对于每个系统用户有拥有一个访问权限。最一般的访问权限包括读文件(包括所有目录中的文件),写一个或
多个文件和执行一个文件(如果它是一个可执行文件或者是程序的时候)。Windows NT,Novell 公司的 Netware,Digital 公司的 OpenVMS 和基于 UNIX 系统是使用这种访问控制表的系统。而此表的实现在各个系统中却不一样。为什么不提倡 catch(Exception)? 原因可能有两点:1)try..catch 在出现异常的时候影响性能 2)应该捕获更具体得异常,比如 IOExeception,OutOfMemoryException 等 Debug.Write 和 Trace.Write 有什么不同?何时应该使用哪一个? Debug.Write 是调试的时候向跟踪窗口输出信息。当编译模式为 debug 的时候才有效,为release 的时候 Debug.Write 在编译的时候会忽略,而 Trace 则是在 debug 和 release 两种模式下均可以向跟踪窗口输出信息。 Debug Build 和 Release Build 的区别,是否会有明显的速度变化?请说明理由。 Debug 会产生 pdb 文件,release 不会。Debug 用于开发时的调试,不能要于部署,而release 用于部署.debug 编译一些特殊代码,比如#IFDEBUG Debug.Write 等,而 Release 则会将那些特殊标记省略 PDB 程序数据库文件,文件保存着调试和项目状态信息,使用这些信息可以对程序的调试配置进行增量链接。JIT 是以 assembly 为单位发生还是以方法为单位发生?这对于工作区有何影响? 方法,道理很简单,因为对于一次运行,很可能只用到一个程序集中极少数类型和对象,而大部分可能并不会被使用,此时 CLR 傻乎乎的给整个程序集都给 Compile 了,CLR 不是傻疯了么 a.Equals(b)和 a == b 一样吗? 不一样。a.Equals(b)表示 a 与 b 一致, a==b 表示 a 与 b 的值相等 在对象比较中,对象一致和对象相等分别是指什么? 对象一致是指两个对象是同一个对象,引用相同。而对象相等是指两个对象的值相同,但引用不一定相同 在.NET 中如何实现深拷贝(deep copy)? 实现 IClonable 接口 请解释一下 IClonable IClonable 方法是实现深度复制的接口,实现它应该能深度复制一个对象出来。深度复制的特征的调用对象的构造方法,创建新的对象,包括创建对象中嵌套的引用对象的新实例。 而 Shadow 复制则不同,是浅表复制,不重新创建新实例。浅表复制的实现是Object.MemberWiseClone().深度复制(Deep Copy)与浅表复制(Shadow Copy)的比较using System;public class Name{ public string FirstName; public string LastName;}public class Person : ICloneable{ public Name PersonName; public string Email; //// <summary> /// Deep Copy 的例子 /// </summary> /// <returns></returns> public Object Clone() { Person p = new Person();
p.Email = this.Email; p.PersonName = new Name(); p.PersonName.FirstName = this.PersonName.FirstName; p.PersonName.LastName = this.PersonName.LastName; return p; } public void ChangLastName(string lastName) { this.PersonName.LastName = lastName; } public static void Main() { Person p = new Person(); p.PersonName = new Name(); p.PersonName.LastName = "jill"; p.PersonName.FirstName = "zhang"; p.Email = "jillzhang@126.com"; Person sameNamePerson = p.Clone() as Person; sameNamePerson.ChangLastName("clr_"); Console.WriteLine(p.PersonName.LastName); Console.WriteLine(sameNamePerson.PersonName.LastName); Person samePerson = p.MemberwiseClone() as Person; samePerson.ChangLastName("Shadow"); Console.WriteLine(p.PersonName.LastName); Console.WriteLine(sameNamePerson.PersonName.LastName); Console.Read(); }}结果:jillclr_Shadowclr_string 是值类型还是引用类型? 引用类型 XmlSerializer 使用的针对属性的模式有什么好处?解决了什么问题? 只序列化有用的数据,而不是序列化整个对象。实现没必要的数据冗余,和提升序列化时的性能。 特性能够放到某个方法的参数上?如果可以,这有什么用? 可以,作用可以对参数有进一步限定,比如输入参数为 int 类型,可以通过允许AttributeTargets=ParameterInfo 的 Attribute 自定义实现来限定输入参数的大小,比如当输入参数小于 100 的时候便报错。 对方法的参数设置 Attribute 的例子 [AttributeUsage(AttributeTargets.Parameter)]public class ParameterAtt : Attribute{ public int Min = 100;}public class AttributeTest{
public void TestMethod([ParameterAtt(Min = 100)] int par1) { ParameterInfo para = MethodInfo.GetCurrentMethod().GetParameters()[0]; ParameterAtt att = ParameterAtt.GetCustomAttribute(para, typeof(ParameterAtt))as ParameterAtt; if (att.Min > par1) { throw new Exception("要求 para1 最小为" + att.Min); } }} 用什么方法比较 2 个字符串相似,且在系统运行时长驻内存? 生成正则表达式进行比较,使用静态变量/方法就可以长驻内存了Collection 和 Collections 的区别? Collection 是集合类的上级接口,Collections 是针对集合类的一个帮助类,它提供一系列静态方法来实现对各种集合的搜索,排序,线程安全化操作。 存在 System.Collections 命名空间死锁的必要条件?怎么克服?系统的资源不足,进程的推进的顺序不合适,资源分配不当,一个资源每次只能被一个进程使用,一个资源请求资源时,而此时这个资源已阻塞,对已获得资源不放,进程获得资源时,未使用完前,不能强行剥夺。什么是死锁?死锁(Deadlock):是指两个或两个以上的进程在运行过程中,因争夺资源而造成的一种互相等待(谁也无法再继续推进)的现象,若无外力作用,它们都将无法推进下去。死锁的四个必要条件l 互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。l 请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源。l 非剥夺条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。l 循环等待条件(Circular wait):系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源。处理死锁的策略1.忽略该问题。例如鸵鸟算法,该算法可以应用在极少发生死锁的的情况下。为什么叫鸵鸟算法呢,因为传说中鸵鸟看到危险就把头埋在地底下,可能鸵鸟觉得看不到危险也就没危险了吧。跟掩耳盗铃有点像。2.检测死锁并且恢复。3.仔细地对资源进行动态分配,以避免死锁。4.通过破除死锁四个必要条件之一,来防止死锁产生。什么是 Windows 服务,它的生命周期与标准的 EXE 程序有什么不同Windows 服务是运行在 windows 后台指定用户下(默认 System)的应用程序,它没有标准的 UI 界面,想比标准的 EXE 程序,Windows 服务是在服务开始的时候创建,而在服务结束的时候销毁,而且可以设置服务是否与操作系统一起启动,一起关闭。它支持三种方式:1)自动方式 2)手动方式 3)禁用。自动方式的时候,windows 服务将在 OS 启动后自动启动运行,而手动方式则必须手工启动服务,禁用的情况下服务将不能被启动。另外标准的 EXE 默认使用的当前登录的用户,而 windows 服务则默认使用 System 用户,这在对系统资源访问的时候特别需要注意。请解释转发与跳转的区别? 转发就是服务端的跳转 A 页面提交数据到 B 页面,B 页面进行处理然后从服务端跳转到其它页面,跳转就是指客户端的跳转请简述一下用 Socket 进行同步通讯编程的详细步骤1、在应用程序和远程设备中使用协议和网络地址初始化套接字2、在应用程序中通过指定端口和地址建立监听3、远程设备发出连接请求
4、应用程序接受连接产生通信 scoket5、应用程序和远程设备开始通讯(在通讯中应用程序将挂起直到通讯结束)6、通讯结束,关闭应用程序和远程设备的 Socket 回收资源什么叫做 SQL 注入,如何防止?请举例说明。 利用 sql 关键字对网站进行攻击。过滤关键字'等 所谓 SQL 注入(SQL Injection),就是利用程序员对用户输入数据的合法性检测不严或不检测的特点,故意从客户端提交特殊的代码,从而收集程序及服务器的信息,从而获取想得到的资料。请叙述属性与索引器的区别。 属性 索引器 通过名称标识。 通过签名标识。 通过简单名称或成员访问来访问。 通过元素访问来访问。 可以为静态成员或实例成员。 必须为实例成员。 属性的 get 访问器没有参数。 索引器的 get 访问器具有与索引器相同的形参表 属性的 set 访问器包含隐式 value 参数。除了 value 参数外,索引器的 set 访问器还具有与索引器相同的形参表。String 类与 StringBuilder 类有什么区别?为啥在.Net 类库中要同时存在这 2 个类? 如果要操作一个不断增长的字符串,尽量不用 String 类,改用 StringBuilder 类。两个类的工作原理不同:String 类是一种传统的修改字符串的方式,它确实可以完成把一个字符串添加到另一个字符串上的工作没错,但是在.NET 框架下,这个操作实在是划不来。因为系统先是把两个字符串写入内存,接着删除原来的 String 对象,然后创建一个 String 对象,并读取内存中的数据赋给该对象。这一来二去的,耗了不少时间。而使用 System.Text 命名空间下面的 StringBuilder 类就不是这样了,它提供的 Append 方法,能够在已有对象的原地进行字符串的修改,简单而且直接。当然,一般情况下觉察不到这二者效率的差异,但如果你要对某个字符串进行大量的添加操作,那么 StringBuilder 类所耗费的时间和 String 类简直不是一个数量级的选择题1、您要创建 ASP.NET 应用程序用于运行 AllWin 公司内部的 Web 站点,这个应用程序包含了 50 个页面。您想要配置这个应用程序以便当发生一个 HTTP 代码错误时它可以显示一个自定义的错误页面给用户。您想要花最小的代价完成这些目标,您应该怎么做?(多选)( CD ) A.在这个应用程序的 Global.asax 文件中创建一个 Application_Error 过程去处理 ASP.NET 代码错误。 B.在这个应用程序的 Web.config 文件中创建一个 applicationError 节去处理 ASP.NET 代码错误。 C.在这个应用程序的 Global.asax 文件中创建一个 CustomErrors 事件去处理 HTTP 错误。 D.在这个应用程序的 Web.config 文件中创建一个 CustomErrors 节去处理 HTTP 错误。 E.在这个应用程序的每一页中添加一个 Page 指示符去处理 ASP.NET 代码错误。F. 在这个应用程序的每一页中添加一个 Page 指示符去处理 ASP.NET HTTP 错误。2、您的公司有一个 DB Server,名为 AllWin,其上装了 MS SQLSERVER 2000。现在需要您写一个数据库连接字符串,用以连接 AllWin 上 SQL SERVER 中的一个名为 PubBase 实例的 Test 库。请问,应该选择下面哪一个字符串?( B ) A. “Server=AllWin;Data Source=PubBase;Initial Catalog=Test;Integrated Security=SSPI” B. “Server= AllWin;Data Source=PubBase;Database=Test;Integrated Security= SSPI” C. “Data Source= AllWin \PubBase;Initial Category=PubBase;Integrated Security= SSPI” D. “Data Source= AllWin \ PubBase;Database=Test;Integrated Security= SSPI”3. 您要创建一个 ASP.NET 应用程序在 DataGrid 控件中显示一个经过排序的列表。产品数据被存放于一个名为 PubBase 的 Microsoft SQL Server 数据库。每个产品的主键是 ProductID,Numeric 型并且每个产品有一个字母描述字段,名为 ProductName。您使用一个 SqlDataAdapter 对象和一个SqlCommand 对象通过调用一个存储过程从数据库中获取产品数据。您将 SqlCommand 对象的
CommandType 属性设置为 CommandType.StoredProcedure,并将它的 CommandText 属性设置为 procProductList。您成功的获取了一个 DataTable 对象,其中是已经按 ProductID 降序排列的产品列表。您打算显示以相反的字母顺序排列的 ProductName,请问该怎么做? ( B ) A. 将 SqlCommand 对象的 CommandType 属性修改为 CommandType.Text,将 CommandText 属性修改为”SELECT * FROM procProductList ORDER BY ProductName DESC”。然后将这个 DataTable 对象绑定到 DataGrid 控件。 B. 创建一个基于这个 DataTable 对象的新的 DataView 并将这个 DataView 的 Sort 属性设置为“ProductName DESC”。然后将这个 DataView 对象绑定到 DataGrid 控件。 C. 将 DataGrid 控件的 AllowSorting 属性设置为 True,并将 DataGridColumn 的SortExpression 属性设置为 “ProductName DESC”.以显示 ProductName。然后将这个 DataTable 对象绑定到 DataGrid 控件。 D. 将 DataTable 对象的 DisplayExpression 属性设置为 “ORDER BY ProductName DESC”.。然后将这个 DataTable 对象绑定到 DataGrid 控件。4、您需要创建一个 ASP.NET 应用程序,公司考虑使用 Windows 身份认证。 所有的用户都存在于 AllWin 这个域中。您想要使用下列认证规则来配置这个应用程序: a、 匿名用户不允许访问这个应用程序。 b、 所有雇员除了 Tess 和 King 都允许访问这个应用程序。 请问您应该使用以下哪一个代码段来配置这个应用程序?( A )A. <authorization> <deny users=”allwin\tess, allwin\king”> <allow users=”*”> <deny users=”?”> </authorization>B. <authorization> <allow users=”*”> <deny users=”allwin\tess, allwin\king”> <deny users=”?”> </authorization>C. <authorization> <deny users=”allwin\tess, allwin\king”> <deny users=”?”> <allow users=”*”> </authorization>D. <authorization> <allow users=”allwin\tess, allwin\king”> <allow users=”*”> </authorization>E.<authorization> <allow users=”*”> <deny users=”allwin\tess, allwin\king”> </authorization>5.对于一个实现了 IDisposable 接口的类,以下哪些项可以执行与释放或重置非托管资源相关的应用程序定义的任务?(多选) ( ABC )A.Close B.DisposeC.FinalizeD.using E.Quit6.Net 依赖以下哪项技术实现跨语言互用性?( C )A.CLR B.CTS C.CLS D.CTT7.以下哪个类是 int 的基类?( )A.Int32 B.Object C.ValueType D.Int168.以下哪些可以作为接口成员? (多选) ( ABDE )
A.方法 B.属性 C.字段 D.事件 E.索引器F.构造函数 G.析构函数9.以下关于 ref 和 out 的描述哪些项是正确的?(多选) ( ACD )A.使用 ref 参数,传递到 ref 参数的参数必须最先初始化。B.使用 out 参数,传递到 out 参数的参数必须最先初始化。C.使用 ref 参数,必须将参数作为 ref 参数显式传递到方法。D.使用 out 参数,必须将参数作为 out 参数显式传递到方法。10.“访问范围限定于此程序或那些由它所属的类派生的类型”是对以下哪个成员可访问性含义的正确描述?( B )A.public B.protected C.internal D.protected internal11.class Class1{ private static int count = 0; static Class1() { count++; } public Class1() { count++; }}Class1 o1 = new Class1();Class1 o2 = new Class1();请问,o1.Count 的值是多少?( C )A.1 B.2 C.3 D.412.using System;abstract class BaseClass{ public virtual string MethodA() { return "aaaa"; } public virtual string MethodB() { return "bbbb"; }}class Class1: BaseClass{ public string MethodA(string arg) { return "cccc"; } public override string MethodB() { return "dddd"; }}
class Class2: Class1{ new public string MethodB() { return "eeee"; }}class MainClass{ public static void Main(string[] args) { Class2 o = new Class2(); Console.WriteLine(o.MethodA()); }}结果:aaaa请按任意键继续. . .请问,o.MethodA 调用的是: ( A )A.BaseClass.MethodAB.Class2.MethodAC.Class1.MethodAD.都不是13.接口是一种引用类型,在接口中可以声明(A),但不可以声明公有的域或私有的成员变量。a)方法、属性、索引器和事件; b)方法、属性信息、属性; c)索引器和字段; d)事件和字段;14.ASP.NET 框架中,服务器控件是为配合 Web 表单工作而专门设计的。服务器控件有两种类型,它们是(A )a)HTML 控件和 Web 控件 b)HTML 控件和 XML 控件 c)XML 控件和 Web 控件 d)HTML 控件和 IIS 控件15.ASP.NET 中,在 Web 窗体页上注册一个用户控件,指定该控件的名称为”Mike”,正确的注册指令为( D)a)<%@Register TagPrefix = “Mike” TagName = “Space2” Src = “myX.ascx”%>b)<%@Register TagPrefix = “Space2” TagName = “Mike” Src = “myX.ascx”%>c)<%@Register TagPrefix = “SpaceX” TagName = “Space2” Src = “Mike”%>d)以上皆非16.在 ADO.NET 中,对于 Command 对象的 ExecuteNonQuery()方法和 ExecuteReader()方法,下面叙述错误的是(C)。a)insert、update、delete 等操作的 Sql 语句主要用 ExecuteNonQuery()方法来执行;b)ExecuteNonQuery()方法返回执行 Sql 语句所影响的行数。c)Select 操作的 Sql 语句只能由 ExecuteReader()方法来执行;d)ExecuteReader()方法返回一个 DataReder 对象;17.下列 ASP.NET 语句(b)正确地创建了一个与 SQL Server 2000 数据库的连接。a)SqlConnection con1 = new Connection(“Data Source = localhost; Integrated Security =SSPI; Initial Catalog = myDB”);b)SqlConnection con1 = new SqlConnection(“Data Source = localhost; Integrated Security = SSPI; Initial Catalog = myDB”);c)SqlConnection con1 = new SqlConnection(Data Source = localhost; Integrated Security = SSPI; Initial Catalog = myDB);d)SqlConnection con1 = new OleDbConnection(“Data Source = localhost; Integrated Security = SSPI; Initial Catalog = myDB”);18.Winform 中,关于 ToolBar 控件的属性和事件的描述不正确的是(D)。a)Buttons 属性表示 ToolBar 控件的所有工具栏按钮b)ButtonSize 属性表示 ToolBar 控件上的工具栏按钮的大小,如高度和宽度
描述抽象类 用 abstract 修饰的类。抽象类可以包含实现的成员。未实现的成员隐含的是 virtual 属性,子类实现时必须用 override 关键字。请解释接口的显式实现有什么意义? 接口是其他类型为确保它们支持某些操作而实现的引用类型。接口从不直接创建而且没有实际的表示形式,其他类型必须转换为接口类型。一个接口定义一个协定。实现接口的类或结构必须遵守其协定。接口可以包含方法、属性、索引器和事件作为成员。在项目中为什么使用接口?接口的好处是什么?什么是面向接口开发? 接口只是一种约束。使用 interface 去定义某些特定的功能,为的是不要将代码写死在自定义类里,以便在系统开发、事后维护、功能扩充 上更有扩展性。 接口用于描述一组类的公共方法/公共属性. 它不实现任何的方法或属性,只是告诉继承它的类至少要实现哪些功能,继承它的类可以增加自己的方法. 使用接口可以使继承它的类: 命名统一/规范,易于维护。提供永远的接口。 当类增加时,现有接口方法能够满足继承类中的大多数方法,没必要重新给新类设计一组方法,也节省了代码,提高了开发效率。 面向接口开发的好处有结构清晰,类间通信简单易懂,扩展性好,提高复用性等等。 面向接口开发就是指面向抽象协议编程,实现者在实现时要严格按协议来办。接口和类有什么异同。不同点:1、不能直接实例化接口。2、接口只包含方法或属性的声明,不包含方法的实现。3、接口可以多继承,类只能单继承。4、类有分部类的概念,定义可在不同的源文件之间进行拆分。5、表达的含义不同,接口主要定义一种规范,统一调用方法,也就是规范类,约束类,类是方法功能的实现和集合相同点:1、接口、类和结构都可以从多个接口继承。2、接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员。3、接口和类都可以包含事件、索引器、方法和属性。您在什么情况下会用到虚方法或抽象类,接口? 如果某个方法可能性在派生类中会被重写。这时就将该方法写为虚方法。 抽象类:是一个类型,与派生类之间的关系是一个“ISA”的关系。用来做基类,抽象类不能创建对象,类中包括抽象方法和实例方法。 接口:是设计一个规范,描述了 Can do ;与实现类之间是中”LINE A 的关系,C#中接口不能包含字段访问修饰符。对比抽象基类和接口的使用 抽象类能有具体实现,而接口只定义行为规范,不能有具体实现。一个类只能继承一个父类,但能实现多个接口。 C#中的接口和抽象类有什么异同。你选择使用接口和抽象类的依据是什么? 1、继承:接口支持多继承;抽象类不能实现多继承。 2、表达的概念:接口用于规范,抽象类用于共性。抽象类是一类事物的高度聚合,那么对于继承抽象类的子类来说,对于抽象类来说,属于"是"的关系;而接口是定义行为规范,因此对于实现接口的子类来说,相对于接口来说,是"行为需要按照接口来完成"。 3、方法实现:对抽象类中的方法,即可以给出实现部分,也可以不给出;而接口的方法(抽象规则)都不能给出实现部分,接口中方法不能加修饰符。 4、子类重写:继承类对于两者所涉及方法的实现是不同的。继承类对于抽象类所定义的抽象方法,可以不用重写,也就是说,可以延用抽象类的方法;而对于接口类所定义的方法或者属性来说,在继承类中必须重写,给出相应的方法和属性实现。 5、新增方法的影响:在抽象类中,新增一个方法的话,继承类中可以不用作任何处理;而对于接口来说,则需要修改继承类,提供新定义的方法。 6、接口可以作用于值类型(枚举可以实现接口)和引用类型;抽象类只能作用于引用类
c)DropDownArrows 属性表明工具栏按钮(该按钮有一列值需要以下拉方式显示)旁边是否显示下箭头键d)ButtonClick 事件在用户单击工具栏任何地方时都会触发19.在 ADO.NET 中执行一个存储过程时,如果要设置输出参数则必须同时设置参数的方向和(B),必要时还要设置参数尺寸。a)大小; b)上限; c)初始值; d)类型;20.如果将窗体的 FormBoderStyle 设置为 None,则( B)。a)窗体没有边框并不能调整大小; b)窗体没有边框但能调整大小;c)窗体有边框但不能调整大小; d)窗体是透明的;21.如果要将窗体设置为透明的,则( B)a)要将 FormBoderStyle 属性设置为 None; b)要将 Opacity 属性设置为小于 100%得值;c)要将 locked 属性设置为 True; d)要将 Enabled 属性设置为 True;22.下列关于 C#中索引器理解正确的是(B/C )a)索引器的参数必须是两个或两个以上 b)索引器的参数类型必须是整数型c)索引器没有名字 d)以上皆非23.下面描述错误的是( C/D)。a)窗体也是控件; b)窗体也是类; c)控件是从窗体继承来的; d)窗体的父类是控件类;24.要对注册表进行操作则必须包含( D)。a)System.ComponentModel 命名空间; b)System.Collections 命名空间;c)System.Threading 命名空间; d)Microsoft.Win32 命名空间;25.要创建多文档应用程序,需要将窗体的(D )属性设为 true。a)DrawGrid; b)ShowInTaskbar; c)Enabled; d)IsMdiContainer;26.如果设 treeView1=new TreeView(),则 treeView1.Nodes.Add("根节点")返回的是一个 ()类型的值。a)TreeNode;b)int;c)string;d)TreeView;27.下面关于 XML 的描述错误的是(D)。a)XML 提供一种描述结构化数据的方法;b)XML 是一种简单、与平台无关并被广泛采用的标准;c)XML 文档可承载各种信息;d)XML 只是为了生成结构化文档;28.装箱、拆箱操作发生在: ( C )A.类与对象之间 B.对象与对象之间C.引用类型与值类型之间 D.引用类型与引用类型之间29.用户类若想支持 Foreach 语句需要实现的接口是: ( A )A.IEnumerableB.IEnumeratorC.ICollectionD.ICollectData30..Net Framework 通过什么与 COM 组件进行交互操作?( C )A.Side By SideB.Web ServiceC.InteropD.PInvoke31..Net 依靠以下哪一项技术解决 COM 存在的 Dll Hell 问题的?( A )A.Side By SideB.InteropC.PInvokeD.COM+32.装箱与拆箱操作是否是互逆的操作?( B )A.是 B.否33.以下哪个是可以变长的数组?( D )A.Array B.string[]
C.string[N] D.ArrayList34.用户自定义异常类需要从以下哪个类继承:( A )A.Exception B.CustomExceptionC.ApplicationException D.BaseException35 以下叙述正确的是: B CA. 接口中可以有虚方法。B. 一个类可以实现多个接口。 C. 接口不能被实例化。 D. 接口中可以包含已实现的方法。36 从数据库读取记录,你可能用到的方法有:B C D A. ExecuteNonQuery B. ExecuteScalar C. Fill D. ExecuteReader37.对于一个实现了 IDisposable 接口的类,以下哪些项可以执行与释放或重置非托管资源相关的应用程序定义的任务?(多选) ( ABC ) A.Close B.Dispose C.Finalize D.using E.Quit 38.以下关于 ref 和 out 的描述哪些项是正确的?(多选) ( ACD ) A.使用 ref 参数,传递到 ref 参数的参数必须最先初始化。 B.使用 out 参数,传递到 out 参数的参数必须最先初始化。 C.使用 ref 参数,必须将参数作为 ref 参数显式传递到方法。 D.使用 out 参数,必须将参数作为 out 参数显式传递到方法。39.在对 SQL Server 数据库操作时应选用(A)。a)SQL Server .NET Framework 数据提供程序;b)OLE DB .NET Framework 数据提供程序;c)ODBC .NET Framework 数据提供程序;d)Oracle .NET Framework 数据提供程序;40.下列选项中,(C)是引用类型。a)enum 类型 b)struct 类型 c)string 类型 d)int 类型41.关于 ASP.NET 中的代码隐藏文件的描述正确的是(C)a)Web 窗体页的程序的逻辑由代码组成,这些代码的创建用于与窗体交互。编程逻辑唯一与用户界面不同的文件中。该文件称作为“代码隐藏”文件,如果用 C#创建,该文件将具有“.ascx.cs”扩展名。b)项目中所有 Web 窗体页的代码隐藏文件都被编译成.EXE 文件。c)项目中所有的 Web 窗体页的代码隐藏文件都被编译成项目动态链接库(.dll)文件。d)以上都不正确。42.以下描述错误的是(A)a)在 C++中支持抽象类而在 C#中不支持抽象类。b)C++中可在头文件中声明类的成员而在 CPP 文件中定义类的成员,在 C#中没有头文件并且在同一处声明和定义类的成员。c)在 C#中可使用 new 修饰符显式隐藏从基类继承的成员。d)在 C#中要在派生类中重新定义基类的虚函数必须在前面加 Override。43.C#的数据类型有(A)a)值类型和调用类型; b)值类型和引用类型;c)引用类型和关系类型;d)关系类型和调用类型;44.下列描述错误的是(D)a)类不可以多重继承而接口可以;b)抽象类自身可以定义成员而接口不可以;c)抽象类和接口都不能被实例化;d)一个类可以有多个基类和多个基接口;45.在 DOM 中,装载一个 XML 文档的方法(D)a)save 方法 b)load 方法 c)loadXML 方法 d)send 方法46.下列关于构造函数的描述正确的是(C)a)构造函数可以声明返回类型。
b)构造函数不可以用 private 修饰c)构造函数必须与类名相同d)构造函数不能带参数47.以下是一些 C#中的枚举型的定义,其中错误的用法有()a)public enum var1{ Mike = 100, Nike = 102, Jike }b)public enum var1{ Mike = 100, Nike, Jike }c)public enum var1{ Mike=-1 , Nike, Jike }d)public enum var1{ Mike , Nike , Jike }48.int[][] myArray3=new int[3][]{new int[3]{5,6,2},new int[5]{6,9,7,8,3},new int[2]{3,2}}; myArray3[2][2]的值是(D)。a)9 b)2 c)6 d)越界本文来自 CSDN 博客,转载请标明出处:http://blog.csdn.net/aspnet2002web/archive/2010/12/18/6084149.aspx
型。 7、接口不能包含字段和已实现的方法,接口只包含方法、属性、索引器、事件的签名;抽象类可以定义字段、属性、包含有实现的方法。 8、接口可以用于支持回调(CallBack);抽象类不能实现回调,因为继承不支持。 如下给出两者的简单对比表格。 接口 抽象类多继承 支持 不支持类型限制 没有 有,只能是引用类型方法实现 继承类型中必须给出方法实现 继承类中可以不给出扩展性 比较麻烦 相对比较灵活多层继承 比较麻烦,需要借助虚函数 比较灵活如何选择:1、看是否需要多继承,如果需要就只能使用接口 2、看你在累里定义的方法是否需要有实现的代码,如果要,就使用抽象类3、使不同的类型有共同的特性的时候使用接口,因为它支持多继承,只想从一个类型继承出不同的行为的子类的时候使用抽象类,可以在基类里有代码实现。从实现接口和现实抽象类的方法来看,接口是死的,抽象类是活的,当然实现接口的类是活的。结构和类的区别简单的说成 class 可以被实例化,属于引用类型 struct 属于值类型,1)、类型,空间分配。结构是值类型,是分配在内存的栈上的.类时引用类型,,是分配在内存的堆上的。结构实例化可以不用 new,即使用 new 操作也不会在堆里分配内存。作参数是按值传递,类时引用传递,变量用完自动解除内存分配,类需要垃圾回收期2)、基类。结构继承自 System.ValueType 类,因此不具多态性。但是注意,System.ValueType 是个引用类型。类继承自 System.Object 类;3)、职能。struct 常用于存储数据;而 class 表现为行为4)、结构没有类的特性,不支持继承。但可以实现接口。5)、结构无法声明无参的构造函数,但可以声明有参的构造函数6)、结构的实例成员不能直接赋初值,必须通过构造函数来赋值,但静态成员可以直接赋初值7)、无抽象结构,但有抽象类(abstract)8)、class 可以声明 protected 成员、virtual 成员、sealed 成员和 override 成员;而 struct 不可以,但是值得注意的是,struct 可以重载 System.Object 的 3 个虚方法,Equals()、ToString()和GetHashTable()。接口与继承的区别?什么时候使用接口,什么时候使用继承? (1) 接口定义一个类型需要实现的方法,属性,索引和事件,包括可能的参数类型和返回值类型,而把具体的实现交由相应的类或结构来做,从而为组件提供多态能力。 (2) 继承常用于在一个现有父类的基础上的功能扩展,往往是我们将几个类中相同的成员提取出来放在父类中实现,然后在各自的子类中加以继承。 (3) 接口可以实现多接口继承,而继承只能实现单继承。 (4) 实现继承可继承父类型的实现,由于接口中没有定义方法的实现,因此必须实现继承后该接
口的所有方法。 (5) 为父类型添加方法可能不影响使用继承自该类型实现的用户,而为接口添加方法导致用户必须为新方法添加实现。 (6) 当派生类和基类是 is-a 的关系是使用"继承",典型案例"苹果 is-a 水果",存在 can-do 的关系时使用"接口"重载(Overload )和覆写(Override)的区别 简单的说,一个是同一个函数的几种形式,一个是重写父类函数, 重载:当类包含两个名称相同但签名不同(方法名相同,参数列表不相同)的方法时发生方法重载。用方法重载来提供在语义上完成相同而功能不同的方法。 覆写:在类的继承中使用,通过覆写子类方法可以改变父类虚方法的实现。区别: 1、方法的覆盖是子类和父类之间的关系,是垂直关系;方法的重载是同一个类中方法之间的关系,是水平关系。 2、覆盖只能由一个方法,或只能由一对方法产生关系;方法的重载是多个方法之间的关系。 3、覆盖要求参数列表相同;重载要求参数列表不同。 4、覆盖关系中,调用那个方法体,是根据对象的类型(对象对应存储空间类型)来决定;重载关系,是根据调用时的实参表与形参表来选择方法体的。<%# %> 和 <% %> 有什么区别?<%# %>表示绑定的数据源<% %>是服务器端代码块值类型和引用类型的区别?写出 C#的样例代码。值类型包括简单类型、结构体类型和枚举类型,引用类型包括自定义类、数组、接口、委托等1、赋值方式:将一个值类型变量赋给另一个值类型变量时,将复制包含的值。这与引用类型变量的赋值不同,引用类型变量的赋值只复制对象的引用,而不复制对象本身。2、派生:值类型不可能派生出新的类型,所有的值类型均隐式派生自 System.ValueType。但与引用类型相同的是,结构也可以实现接口。3、null:与引用类型不同,值类型不可能包含 null 值。然而,可空类型功能允许将 null 赋给值类型。4、每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。值类型主要由两类组成:结构、枚举结构分为以下几类:Numeric(数值)类型、整型、浮点型、decimal、bool、用户定义的结构。引用类型的变量又称为对象,可存储对实际数据的引用。声明引用类型的关键字:class、interface、delegate、内置引用类型: object、string5、值类型存贮在栈中,而引用类型存贮在动态的堆中,栈是先进先出的有系统管理的空间,而堆是由应用程序控制的可随时申请和释放该空间,在 Donnet 中一般情况下有垃圾收集器处理,他们的不同导致在编程上的不同。例:"a=null"的意思是:a 的引用置为空但此时 StringBuilder 的堆空间并没有被释放,因此在此之后,输出 b 时,仍然可以输出 mxh using System;using System.Text;class EventDel{ static void Main(string[] args) { StringBuilder a=new StringBuilder();//将 StringBuilder 的一个首地址传给 a StringBuilder b=a; //将 StringBuilder 的一个首地址传给 b b.Append("mxh"); Console.WriteLine(a); a=null;
Console.WriteLine(b); }} 输出结果:mxhmxh请按任意键继续. . .C#中的委托是什么?如何理解委托?简单的说:委托是一种方法容器,里面可以装载若干个具有相同签名的方法引用地址,那么调用委托,就相当于同时调用了该容器内的所有方法。委托可以看做一种新的对象类型,具有面向对象的特点,定义时可签名接收参数,委托实例化时,可以把方法名作为一个参数传递给委托对象,委托可以理解为指向函数的引用。生成的委托对象可以代理所传递的方法,可以接收方法的参数。也就是定义了委托,可以在不用调用原方法的情况下,调用那个方法例:例: public delegate string MyDel(string nm,string pwd); //定义委托签名接收两个参数 static void Main(string[] args) { MyDel md=new MyDel(方法名) //定义委托对象,其引用变量指向参数中的方法 string result=md("张三","1234"); //调用委托对象,传递所指方法的参数 }委托类似于 C 或 C++中的函数指针。但不同的是委托是面向对象、类型安全的。委托允许将方法作为参数进行传递。委托可用于定义回调方法。委托可以链接在一起;创建多个对象,使用“+=”累加到同一个委托对象上的引用上,例如,可以对一个事件调用多个方法。public delegate string MyDel(string nm,string pwd); //定义委托签名接收两个参数static void Main(string[] args){ MyDel md=new MyDel(方法 1); //委托对象,其引用变量指向参数中的方法 md+=new MyDel(方法 2); md+=new MyDel(方法 3); string result=md("张三","1234"); //调用委托对象,传递所指方法的参数}方法不需要与委托签名精确匹配。有关更多信息,请参见协变和逆变。C# 2。0 版引入了匿名方法的概念,此类方法允许将代码块作为参数传递,以代替单独定义的方法。如:using System;class Name{ private string pName; //定义委托类型 public delegate void myEventHandler(object sender, NameEventArgs e); //定义 Get 事件 public event myEventHandler Get; internal string Text { get { return this.pName; } set{
//-----------------------------------------------------------2 this.pName=value; this.OnGet(new NameEventArgs("Text 属性被更改了")); } } void OnGet(NameEventArgs e)//----------------------------------------3 { this.Get(this, e); //触发事件 } public override string ToString() { return "Name 类的对象"; } public class NameEventArgs : EventArgs //自定义事件信息类 { string pArgs; public NameEventArgs(string s) { pArgs = s; } public override string ToString() { return pArgs; } }}class EventDel{ static void Main(string[] args) { Name myname = new Name(); myname.Get += new Name.myEventHandler(myname_get); //--------------4 myname.Text = "张三";//--------------------------------------------1 } //用于订阅事件的 myname_get()方法 static void myname_get(object sender, Name.NameEventArgs e) //---------5 { //输出事件信息,和事件发布者的属性 Console.WriteLine("事件信息:{0}", e.ToString()); Console.WriteLine("事件发布者:{0}", sender.ToString()); Console.WriteLine("你输入的名字是:{0}",((Name)sender).Text); }} 结果:事件信息:Text 属性被更改了事件发布者:Name 类的对象你输入的名字是:张三请按任意键继续. . .使用匿名方法,直接将方法体的代码和委托对象关联而不需要单独定义此方法class EventDel{ static void Main(string[] args)