上一页 1 ··· 6 7 8 9 10 11 12 13 14 下一页
  2011年4月2日
摘要: 网上收集的面试题,自己做了一下,改了些小错。1. 简述 private、 protected、 public、 internal 修饰符的访问权限。答 . private : 私有成员, 在类的内部才可以访问。 protected : 保护成员,该类内部和继承类中可以访问。 public : 公共成员,完全公开,没有访问限制。 internal: 在同一程序集内可以访问。2. 列举ASP.NET 页面之间传递值的几种方式。 答. 1.使用QueryString, 如....?id=1; response. Redirect().... 2.使用Session变量 3.使用Server.Tran 阅读全文
posted @ 2011-04-02 17:51 辛勤的代码工 阅读(733) 评论(1) 推荐(0) 编辑
  2011年4月1日
摘要: 先绑定类型,然后调用方法的方式通常称为晚绑定。而早绑定指一个应用程序使用的类型和方法在编译时就已确定。 System.Reflection.Assembly类型提供了三个静态方法允许我们显式加裁一个程序集:Load(通过接受一个程序集标识来加载程序集,可加载弱程序集和强程序集)、LoadFrom(通过接受一个程序集文件完整路径名称加载程序集,仅能加载弱程序集)、LoadWithPartialName。我们应该尽可能使用Load方法,避免使用LoadFrom、LoadWithPartialName。 System.AppDomain也提供一个Load方法,该方法是一个实例方法,允许我们将一个程. 阅读全文
posted @ 2011-04-01 21:56 辛勤的代码工 阅读(390) 评论(0) 推荐(0) 编辑
摘要: CLR寄宿 开发CLR时,微软实际上是将其作为一个COM服务器实现在了一个DLL内。也就是说,微软为CLR定义了一个标准的COM接口,并且为该接口和COM服务器分配了GUID。我们安装.NET框架时,表CLR的COM服务器就像其他的COM服务器一样被注册到了Windows的注册表里。 任何Windows应用程序都可以寄宿CLR。我们的非托管宿主(如Windows PE文件格式,其或为一个Windows Exe文件,或为一个动态连接库DLL文件)可以调用CorBindToRuntimeEx函数(其原型定义在MSCorEE.h中)。CorBindToRuntimeEx函数实现在MSCorEE.dl 阅读全文
posted @ 2011-04-01 13:23 辛勤的代码工 阅读(462) 评论(0) 推荐(0) 编辑
  2011年3月31日
摘要: 利用对象代龄提高垃圾收集效率 代龄是旨在提高垃圾收集器性能的一种机制。一个基于代龄的垃圾收集器有以下几点假设:对象越新,其生存期越短。对象越老,其生存期越长。对托管堆的一部分执行垃圾收集要比对整个托管堆执行垃圾收集速度更快。 CLR将对象代龄分为0、1、2,共三代,且对每一代的对象所占用内存容量都设定了一个阀值,代龄越大,内存容量阀值也越大。代龄对象所占用内存超出阀值时,将引发垃圾收集。 在托管堆初始化时,其中不包括任何对象。这时添加到托管堆中的对象被称为第0代对象。当第0代对象所占用内存超过了阀值时,垃圾收集器就必须启动了。经过垃圾收集后存活下来的对象被认为是第1代对象,同时第0代对象暂时空 阅读全文
posted @ 2011-03-31 21:52 辛勤的代码工 阅读(340) 评论(0) 推荐(0) 编辑
摘要: 假设有这样一些数据结构,它们很容易创建但却需要大量的内存和时间。如:我们需要知道用户硬盘中所有目录和文件,我们可以很容易构造一个树来反映这些信息,当应用程序运行时,它可以引用内存中的树,而不必再访问用户的硬盘。这样显然会极大提高应用程序的性能。 但问题在于这个树可能会非常庞大,需要许多内存。如果用户转而访问应用程序的其余部分,那么这个树可能变得不再必要,却浪费着许多内存。我们可能会放弃这个树的根对象的引用,但如果用户又切换回应用程序的第一部分,那我们又需要重新构造该树。使用弱引用,我们可以方便、高效的处理这种情况。 弱引用对象是这样一种对象,如果我们放弃该对象的强引用,将其转至弱引用时,它允. 阅读全文
posted @ 2011-03-31 17:46 辛勤的代码工 阅读(271) 评论(0) 推荐(0) 编辑
摘要: Finalize方法的问题:不能确定它会在何时被调用。由于它不是一个公有方法,我们不能显式调用它。 要提供显式释放或关闭对象的能力,一个类型通常要实现一种被称为Dispose的模式。所有定义了Finalize方法的类型都应该实现本节所描述的Dispose模式以给用户更多的控制权。 上节中OSHandle类实现的改进版,使用Dispose模式:using System;using System.Collections.Generic;using System.Text;using System.Runtime.InteropServices;namespace DisposeTest{ pub. 阅读全文
posted @ 2011-03-31 16:59 辛勤的代码工 阅读(381) 评论(0) 推荐(0) 编辑
  2011年3月30日
摘要: 终止化操作 任何封装了非托管资源的类型,如文件、网络连接、套接字等,都必须支持一种称作终止化的操作。终止化操作允许一种资源在它所占用的内存被回收之前执行一些清理工作。要提供终止化操作,我们必须为类型重写一个名为Finalize的方法,该方法在Object中被定义为受保护的虚方法。当垃圾收集器判定一个对象为可收集的垃圾时,它便会调用该对象的Finalize方法。Finalize方法的实现通常便是调用CloseHandle函数。 然而,在C#中实现Finalize方法并非直接重写Finalize方法,C#编译器为我们提供了与C++析构函数类似特殊语法来定义Finalize方法。下例演示了如何定义一 阅读全文
posted @ 2011-03-30 23:20 辛勤的代码工 阅读(364) 评论(0) 推荐(0) 编辑
摘要: 每个.Net应用程序都有一组根(root)。一个根是一个存储位置,其中包含着一个指向引用类型的内存指针。该指针或指向一个托管堆中的对象,或被设为null。例如,所有的全局引用类型变量或静态引用类型变量都被认为是根。另外,一个线程堆栈上所有引用类型的本地变量或参数变量也被认为是一个根。最后,在一个方法内,指向引用类型对象的CPU寄存器也是一个根。 当JIT编译器编译一个方法的IL代码时,除了产生本地CPU代码外,JIT编译器还创建一个内部的表。该表中的每一个条目都标识着一个方法的本地CPU指令的字节偏移范围,以及该范围中一组包含根的内存地址(或CPU寄存器)。如下图: 如果在0x0000002. 阅读全文
posted @ 2011-03-30 21:30 辛勤的代码工 阅读(324) 评论(0) 推荐(0) 编辑
摘要: 创建、访问、释放资源的几个步骤:调用中间语言(IL)中的newobj指令,为表示某个特定资源的类型实例分配一定的内存空间。调用new操作符时,编译器产生newobj指令。初始化上一步所得的内存,设置资源的初始状态,使其可以为程序所用。类型实例构造器完成这类工作。通过访问类型成员来使用资源。销毁资源状态,执行清理工作。释放内存。引用类型所占的内存由垃圾收集器全权负责释放。值类型所占的内存将随着堆栈空间的消亡而自动消失,无所谓回收。 垃圾收集器对内存中的类型表示着何种资源一无所知,所以垃圾收集器并不清楚怎样执行上述步骤中的第4步。为使资源得到正确清理,开发人员必须自己编写这部分工作的代码。这些代码 阅读全文
posted @ 2011-03-30 20:43 辛勤的代码工 阅读(309) 评论(0) 推荐(0) 编辑
摘要: 异常捕获 异常捕获筛选器会判断抛出的异常类型是否和筛选器指定的类型相匹配,如果匹配成功,那么它会返回一个特殊的值通知CLR。CLR首先执行更低层次的堆栈中所有必要的finally块来清理其中启动的操作,展开调用堆栈。然后CLR才执行与抛出异常类型相匹配的catch块中的代码。未处理异常 登记AppDomain.CurrentDomain.UnhandledException事件可以处理当前应用程序域中的由托管代码抛出的未处理异常(不能处理非托管代码抛出的未处理异常)。该事件的委托原型为: public delegate void UnHandledExceptionEventHandler(o 阅读全文
posted @ 2011-03-30 13:48 辛勤的代码工 阅读(725) 评论(0) 推荐(0) 编辑
上一页 1 ··· 6 7 8 9 10 11 12 13 14 下一页