C学习-常见问题与重要概念-高级软件工程师必须知道的复习进程.doc
《C学习-常见问题与重要概念-高级软件工程师必须知道的复习进程.doc》由会员分享,可在线阅读,更多相关《C学习-常见问题与重要概念-高级软件工程师必须知道的复习进程.doc(51页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Good is good, but better carries it.精益求精,善益求善。C学习-常见问题与重要概念-高级软件工程师必须知道的-目录(1)学习概述-新的在上面2(2)问题-IIS7经典模式和集成模式的区别分析-123(3)问题-DataTable.Select使用得小心,出现查询不到数据-124(4)提高-.NET下的内存分配机制-025(5)提高-.NET中类型的转换-028(6)问题:WebService-服务器未能识别HTTP头SOAPAction的值-2011(7)cs0016:未能写入输出文件c:WINDOWSMicrosoft.NET12(8)问题:虚拟目录继承根
2、Web.Config的问题解决-2813(9)C#获得客户端的IP,主机名获取当前时间的方法14(10)关于Session事件的理解17(11)nullobject模式-详见设计模式学习-提高篇18(12)C#Lock()语句-1320(13)认识全面的null-1322(14)IEnumerator和IEnumberator理解-1225(15)IList接口27(16)视图状态:控件生命周期中的装载和保存视图阶段28(17)提高:.net类的初始化机制,顺序,内存分配概述-1732学习概述-新的在上面值描述20110513注意,新学习的放在上面!复制本节点加在下面即可,注意标注日期学习站点
3、问题-IIS7经典模式和集成模式的区别分析-12值描述很多的项目转移到win7系统上都会出现莫名其妙的问题,这其中有意部分可以通过应用程序池的模式修改解决,这也算是一个解决方案!下面详细描述经典模式与集成模式的区别!简单描述经典模式是为了与之前的版本兼容,使用ISAPI扩展来调用ASP.NET运行库,原先运行于IIS6.0下的Web应用程序迁移到IIS7.0中只要将应用程序配置成经典模式,代码基本不用修改就可以正常运行。集成模式是一种统一的哀求处理管道,它将ASP.NET请求管道与IIS核心管道组合在一起,这种模式能够提供更好的性能,能够实现配置和治理的模块化,而且增加了使用托管代码模块扩展I
4、IS时的灵活性。假如老的Web应用程序运行于IIS7.0的集成模式下,可能需要对应用程序的web.config文件进行修改,尤其是使用了实现IHttpHandler接口的自定义模块的情况。IIS7.0在同一个服务器上能够同时支持两种模式的应用程序。IIS6.0中ASP.NETMMC管理单元用于配置ASP.NET,7.0中ASP.NET应用程序的管理域IIS管理更加紧密的集成在一起,不存在单独的管理单元,所有的IIS和ASP.NET配置都是使用IIS管理器完成的。IIS7.0配置信息基于.NETframework配置系统,所以IIS7.0中运行的应用程序的web.config文件同时包含web服
5、务器和ASP.NET配置设置,例如可以再web.config文件中设置扩展名和文件的映射(IIS6.0中必须在IIS中进行配置)。web.config一些设置仅适用于集成模式,而不适用于经典模式,如经典模式下运行的应用程序则忽略web.config的system.WebServer节中指定的所有托管代码模块和处理程序,这种模式下web应用程序应该在syste.web节的httpModules和httpHandlers中定义模块和处理程序。在将应用程序从经典模式迁移到集成模式时,可以保留经典模式下的自定义模块和处理程序注册,也可以将这些注册移除。如果不移除经典模式下使用的httpModules和
6、httpHandlers注册,则必须将validation元素的validateIntegratedModeConfiguration属性设置为false以避免错误。validation元素是system.webServer元素的子元素。有关更多信息,请参见ASP.NETIntegrationwithIIS7.0(将ASP.NET与IIS7.0集成)中的“Disablingthemigrationmessage”(禁用迁移消息)部分。总结当改变程序池模式时,可能需要修改配置文件,详细见上面描述!学习站点问题-DataTable.Select使用得小心,出现查询不到数据-12值描述2011081
7、2问题描述有时候用这个方法查询能得正确的结果,但当传输的参数10时,通过myds.Tables0.Select(cate=10)就查询不到,而实际上DataTable中是存在数据的?问题解决一开始百思不得其解,因为我认为cate在myds中是被作为int类型处理的。后来,我想到是不是当cate变成两位数时,DataSet把cate作为字符串处理?我将代码改成:querystr=cate=+Request.QueryStringcate+;问题就解决了。相关代码当前学习部分1-应用篇-示例13Demonet201107-EXT.NetVs2008Model_CatchInfoMyApplicat
8、ionUIAccordionBasic.aspx.csprivateDataRowGetSubNode(stringnoteID)DataRowdrs=InitDataTable().Select(ParentID=+noteID+);returndrs;学习站点提高-.NET下的内存分配机制-02值描述内存分配原则在.NETFramework中,内存中的资源(即所有二进制信息的集合)分为托管资源和非托管资源.托管资源必须接受.NETFramework的CLR(通用语言运行时)的管理(诸如内存类型安全性检查),而非托管资源则不必接受.NETFramework的CLR管理.(了解更多区别请参阅.
9、NETFramework或C#的高级编程资料)托管资源在.NETFramework中又分别存放在两种地方:堆栈和托管堆(以下简称堆)。这里只讨论托管资源的内存分配。内存分配机制线程栈|GC堆|LOH对于值类型的实例,CLR在运行时有两种分配方式:(1)如果该值类型的实例作为类型中的方法(Method)中的局部变量,则该实例被创建在线程栈上;(2)如果该值类型的实例作为类型的成员,则该实例作为引用类型(引用类型在GC堆或者LOH上创建)的实例的一部分,被创建在GC堆上。对于引用类型的实例,CLR在运行时也有两种分配方式:(1)如果该引用类型的实例的Size=85000byte,则该实例被创建在L
10、OH(LargeObjectHeap)上(LOH不会被压缩)。要注意的是,对于引用对象,他包括了引用和对象实例两部分,实例需要通过对其存储位置的引用来访问,对于privateObjecto=newObject(),其实可以分解为两句话:privateObjecto;o=newObject();其中privateObjecto是定义了对象的引用,也就是记录对象实例的指针,而不是对象本身。这个引用存储于堆栈中,占用4个字节;当没有使用o=newObject()时,引用本身的值为null,也就是不指向任何有效位置;当o=newObject()后,才真正根据对象的大小,在托管堆中分配空间给对象实例,然
11、后将实例的指针位置赋值给前面的引用。这才完成一个对象的实例化。嵌套结构值类型如果嵌套在引用类型时,也就是值类型在内联的结构中时,其内存分配是什么样子呢?其实很简单,例如类的私有字段如果为值类型,那它作为引用类型实例的一部分,也分配在托管堆上。引用类型嵌套在值类型时,内存的分配情况为:该引用类型将作为值类型的成员变量,堆栈上将保存该成员的引用,而成员的实际数据还是保存在托管堆中。一个简单的讨论ATypemyType=newAType10;/见下面示例【试问】如果AType是值类型,则分配了多少内存;而如果AType是引用类型时,又分配了多少内存?【分析】根据CRL的内存机制,我们知道如果ATpy
12、e为Int32类型,则表示其元素是值类型,而数组本身为引用类型,myType将保存指向托管堆中的一块大小为410byte的内存地址,并且将所有的元素赋值为0;而如果AType为自定义的引用类型,则会只做一次内存分配,在线程的堆栈创建了一个指向托管堆的引用,而所有的元素被设置为null值,表示为空。分配的内存大小计算sizeof(type)sizeof运算符仅适用于值类型,而不适用于引用类型。并仅可用于unsafe模式。分配具体过程(1)计算所需空间大小(2)写屏障:这一步只针对托管堆,因为托管堆涉及到后面的垃圾回收,这一步是必须的。(3)开始实际分配:堆栈的内存地址是由高位到低位向下填充。示例
13、描述现在有MyStruct和MyClass分别代表一个结构体和一个类,如下:在上述的过程中,我们分别定义了值类型变量myStruct和引用类型变量myClass,并使用new操作符完成内存分配和初始化操作。而我们在此强调的是myStruct和myClass两个变量在内存分配方面的区别,还是以一个简明的图来展示一下:我们知道,每个变量或者程序都有其堆栈,不同的变量不能共有同一个堆栈地址,因此myStruct和myStruct2在堆栈中一定占用了不同的堆栈地址,尽管经过了变量的传递,实际的内存还是分配在不同的地址上,如果我们再对myStruct2变量改变时,显然不会影响到myStruct的数据。从
14、图中我们还可以显而易见的看出,myStruct在堆栈中包含其实例数据,而myClass在堆栈中只是保存了其实例数据的引用地址,实际的数据保存在托管堆中。因此,就有可能不同的变量保存了同一地址的数据引用,当数据从一个引用类型变量传递到另一个相同类型的引用类型变量时,传递的是其引用地址而不是实际的数据,因此一个变量的改变会影响另一个变量的值。从上面的分析就可以明白的知道这样一个简单的道理:值类型和引用类型在内存中的分配区别是决定其应用不同的根本原因,由此我们就可以很容易的解释为什么参数传递时,按值传递不会改变形参值,而按址传递会改变行参的值,道理正在于此。更详细的分析,强烈推荐类型实例的创建位置、
15、托管对象在托管堆上的结构。学习站点提高-.NET中类型的转换-02值描述类型转换分为隐式转换和显式转换,他们的转换方式都对应了变换、投射、和装箱/拆箱三种类型。当直接将一种类型赋值给另外一个类型,就是隐式转换。系统会在编译时候进行判断,能否进行隐式转换,如果提示出错,就说明无法隐式转换,如果没有提示,这个隐式转换是成立的,并且不会出现错误;接下来就是利用上面三种方式进行转换了。当采取显式转换时,利用诸如(int)a,convert和parse方法吧。这时候有四种情况,一种是编译就出错,因为根本无法强制转换,另一种是可以编译通过,但是运行时候出错,还一种,就是运行也成功了,但是由于截断等原因,结
16、果是不正确的了,最后一种当然就是转换成功喽。其中对于(int)a,编译时候会确保是存在显示转换关系的,如果不存在,就会提示无法转换。如果可以转换,那不会出错,但是结果不一定对,因为可能截断了部分内容;对于Int32.Parse()表示将数字的字符串转换为32位有符号整数,属于内容转换。只要是字符串,都可以转换过去,至于是否正确,运行过程中会提示是否出错,包括空字符串错,格式不对,或者是溢出。基础.NET中,所有类型都继承自System.Object类型,因此可以很容易的获得对象的准确类型,方法是:GetType()方法。转换机制C#中的类型转换机制有两种分类方法:一种是根据转换方式的不同进行划
17、分,可以分为显式(Explicit)转换和隐式(Implicit)转换两种;另外一种是根据源类型和目标类型之间的关系进行划分,可以分为变换(Conversion)、投射(Cast)和装箱/拆箱(Boxing/Unboxing)。隐式转换就是系统默认的、不需要加以特别声明也不用特殊的方法就可以进行的转换。在隐式转换过程中,编译器无需对转换进行详细检查就能够安全地执行转换。-隐式数值转换实际上就是从低精度的数值类型到高精度的数值类型的转换。-隐式枚举转换允许把十进制整数0转换成任何枚举类型,对应其它的整数则不存在这种隐式转换。还是让我们用例子来说明。-隐式引用转换是指一类引用类型之间的转换,这种转
18、换总是可以成功,因此不需要在运行时进行任何检查。-装箱转换允许将“值类型”隐式转换为“引用类型”。显式转换又叫强制类型转换。与隐式转换正好相反,显式转换需要用户明确地指定转换的类型。-它并不是总能成功,而且常常可能引起信息丢失。IS和AS操作符为了避免在进行强制类型转换时由于目标类型无效,而导致运行时抛出InvalidCastException异常,C#提供了IS与AS操作符进行类型判断与“安全”的强制类型转换。is运算符用于检查对象的类型是否与给定类型兼容(对象是该类型,或是派生于该类型)。is的规则如下:检查对象类型的兼容性,并返回结果,true或者false;不会抛出异常;如果对象为nu
19、ll,则返回值永远为false。代码如下:if(studentObjisStudent)as运算符用于执行引用类型的显式类型转换。如果要转换的类型与指定类型兼容,转换就会成功;如果类型不兼容,则返回null。表达式as类型as运算符类似于类型转换,所不同的是,当转换失败时,as运算符将返回null,而不是引发异常。as的规则如下:检查对象类型的兼容性,并返回结果,如果不兼容就返回null;不会抛出异常;如果结果判断为空,则强制执行类型转换将抛出NullReferenceException异常。代码如下:Students1=studentObjasStudent;/如果CLR检测studentP
20、rogram引用对象类型不兼容目标类型,即不能进行强制类型转换,则返回一个null,永远不会抛出异常【is与as比较】由代码可以看出,CLR实际会检查两次对象的类型,IS操作符首先检测变量的引用是否兼容于指定的类型,如果返回TRUE,则CLR在进行强制类型转换行进行第二次类型的检测,即studentObj对象是否引用一个Student类型。由于强制类型转换CLR必须首先判断变更引用对象的实际类型,然后CLR必须去遍历继承层次结构,用变量引用类型的每个基类型去核对目标类型。这肯定会对性能造成一定的影响。好在C#提供了AS操作符来弥补这一缺陷。常用的三种显示转换方法(typename)valuen
21、ame,是通用方法;Convert类提供了灵活的类型转换封装;Parse方法,适用于向数字类型的转换。【三种方法有什么区别】例如,(int),Int32.Parse()和Convert.toInt32()。那么三种方法有什么区别呢?(int)表示使用显式强制转换,是一种类型转换。当我们从int类型到long、float、double或decimal类型,可以使用隐式转换,但是当我们从long类型到int类型转换就需要使用显式强制转换,否则会产生编译错误。也就是说,这个转换方式,编译时会确保是存在显示转换关系的,如果不存在,就会提示无法转换。在对long类型或是浮点型到int类型的显式强制转换中
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学习 常见问题 重要 概念 高级 软件工程师 必须 知道 复习 进程
限制150内