欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    C学习-常见问题与重要概念-高级软件工程师必须知道的复习进程.doc

    • 资源ID:51384304       资源大小:749KB        全文页数:51页
    • 资源格式: DOC        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    C学习-常见问题与重要概念-高级软件工程师必须知道的复习进程.doc

    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:"WINDOWS"Microsoft.NET"12(8)问题:虚拟目录继承根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注意,新学习的放在上面!复制本节点加在下面即可,注意标注日期学习站点问题-IIS7经典模式和集成模式的区别分析-12值描述很多的项目转移到win7系统上都会出现莫名其妙的问题,这其中有意部分可以通过应用程序池的模式修改解决,这也算是一个解决方案!下面详细描述经典模式与集成模式的区别!简单描述经典模式是为了与之前的版本兼容,使用ISAPI扩展来调用ASP.NET运行库,原先运行于IIS6.0下的Web应用程序迁移到IIS7.0中只要将应用程序配置成经典模式,代码基本不用修改就可以正常运行。集成模式是一种统一的哀求处理管道,它将ASP.NET请求管道与IIS核心管道组合在一起,这种模式能够提供更好的性能,能够实现配置和治理的模块化,而且增加了使用托管代码模块扩展IIS时的灵活性。假如老的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服务器和ASP.NET配置设置,例如可以再web.config文件中设置扩展名和文件的映射(IIS6.0中必须在IIS中进行配置)。web.config一些设置仅适用于集成模式,而不适用于经典模式,如经典模式下运行的应用程序则忽略web.config的system.WebServer节中指定的所有托管代码模块和处理程序,这种模式下web应用程序应该在syste.web节的httpModules和httpHandlers中定义模块和处理程序。在将应用程序从经典模式迁移到集成模式时,可以保留经典模式下的自定义模块和处理程序注册,也可以将这些注册移除。如果不移除经典模式下使用的httpModules和httpHandlers注册,则必须将validation元素的validateIntegratedModeConfiguration属性设置为false以避免错误。validation元素是system.webServer元素的子元素。有关更多信息,请参见ASP.NETIntegrationwithIIS7.0(将ASP.NET与IIS7.0集成)中的“Disablingthemigrationmessage”(禁用迁移消息)部分。总结当改变程序池模式时,可能需要修改配置文件,详细见上面描述!学习站点问题-DataTable.Select使用得小心,出现查询不到数据-12值描述20110812问题描述有时候用这个方法查询能得正确的结果,但当传输的参数>10时,通过myds.Tables0.Select("cate=10")就查询不到,而实际上DataTable中是存在数据的?问题解决一开始百思不得其解,因为我认为cate在myds中是被作为int类型处理的。后来,我想到是不是当cate变成两位数时,DataSet把cate作为字符串处理?我将代码改成:querystr="cate='"+Request.QueryString"cate"+"'"问题就解决了。相关代码当前学习部分1-应用篇-示例13Demonet201107-EXT.NetVs2008Model_CatchInfoMyApplicationUIAccordionBasic.aspx.csprivateDataRowGetSubNode(stringnoteID)DataRowdrs=InitDataTable().Select("ParentID='"+noteID+"'");returndrs;学习站点提高-.NET下的内存分配机制-02值描述内存分配原则在.NETFramework中,内存中的资源(即所有二进制信息的集合)分为"托管资源"和"非托管资源".托管资源必须接受.NETFramework的CLR(通用语言运行时)的管理(诸如内存类型安全性检查),而非托管资源则不必接受.NETFramework的CLR管理.(了解更多区别请参阅.NETFramework或C#的高级编程资料)托管资源在.NETFramework中又分别存放在两种地方:"堆栈"和"托管堆"(以下简称"堆")。这里只讨论托管资源的内存分配。内存分配机制线程栈|GC堆|LOH对于值类型的实例,CLR在运行时有两种分配方式:(1)如果该值类型的实例作为类型中的方法(Method)中的局部变量,则该实例被创建在线程栈上;(2)如果该值类型的实例作为类型的成员,则该实例作为引用类型(引用类型在GC堆或者LOH上创建)的实例的一部分,被创建在GC堆上。对于引用类型的实例,CLR在运行时也有两种分配方式:(1)如果该引用类型的实例的Size<85000Byte,则该实例被创建在GC(GarbageCollection)堆上(当CLR在分配和回收对象时,GC可能会对GC堆进行压缩);(2)如果该引用类型的实例的Size>=85000byte,则该实例被创建在LOH(LargeObjectHeap)上(LOH不会被压缩)。要注意的是,对于引用对象,他包括了引用和对象实例两部分,实例需要通过对其存储位置的引用来访问,对于privateObjecto=newObject(),其实可以分解为两句话:privateObjecto;o=newObject();其中privateObjecto是定义了对象的引用,也就是记录对象实例的指针,而不是对象本身。这个引用存储于堆栈中,占用4个字节;当没有使用o=newObject()时,引用本身的值为null,也就是不指向任何有效位置;当o=newObject()后,才真正根据对象的大小,在托管堆中分配空间给对象实例,然后将实例的指针位置赋值给前面的引用。这才完成一个对象的实例化。嵌套结构值类型如果嵌套在引用类型时,也就是值类型在内联的结构中时,其内存分配是什么样子呢?其实很简单,例如类的私有字段如果为值类型,那它作为引用类型实例的一部分,也分配在托管堆上。引用类型嵌套在值类型时,内存的分配情况为:该引用类型将作为值类型的成员变量,堆栈上将保存该成员的引用,而成员的实际数据还是保存在托管堆中。一个简单的讨论ATypemyType=newAType10;/见下面示例【试问】如果AType是值类型,则分配了多少内存;而如果AType是引用类型时,又分配了多少内存?【分析】根据CRL的内存机制,我们知道如果ATpye为Int32类型,则表示其元素是值类型,而数组本身为引用类型,myType将保存指向托管堆中的一块大小为4×10byte的内存地址,并且将所有的元素赋值为0;而如果AType为自定义的引用类型,则会只做一次内存分配,在线程的堆栈创建了一个指向托管堆的引用,而所有的元素被设置为null值,表示为空。分配的内存大小计算sizeof(type)sizeof运算符仅适用于值类型,而不适用于引用类型。并仅可用于unsafe模式。分配具体过程(1)计算所需空间大小(2)写屏障:这一步只针对托管堆,因为托管堆涉及到后面的垃圾回收,这一步是必须的。(3)开始实际分配:堆栈的内存地址是由高位到低位向下填充。示例描述现在有MyStruct和MyClass分别代表一个结构体和一个类,如下:在上述的过程中,我们分别定义了值类型变量myStruct和引用类型变量myClass,并使用new操作符完成内存分配和初始化操作。而我们在此强调的是myStruct和myClass两个变量在内存分配方面的区别,还是以一个简明的图来展示一下:我们知道,每个变量或者程序都有其堆栈,不同的变量不能共有同一个堆栈地址,因此myStruct和myStruct2在堆栈中一定占用了不同的堆栈地址,尽管经过了变量的传递,实际的内存还是分配在不同的地址上,如果我们再对myStruct2变量改变时,显然不会影响到myStruct的数据。从图中我们还可以显而易见的看出,myStruct在堆栈中包含其实例数据,而myClass在堆栈中只是保存了其实例数据的引用地址,实际的数据保存在托管堆中。因此,就有可能不同的变量保存了同一地址的数据引用,当数据从一个引用类型变量传递到另一个相同类型的引用类型变量时,传递的是其引用地址而不是实际的数据,因此一个变量的改变会影响另一个变量的值。从上面的分析就可以明白的知道这样一个简单的道理:值类型和引用类型在内存中的分配区别是决定其应用不同的根本原因,由此我们就可以很容易的解释为什么参数传递时,按值传递不会改变形参值,而按址传递会改变行参的值,道理正在于此。更详细的分析,强烈推荐类型实例的创建位置、托管对象在托管堆上的结构。学习站点提高-.NET中类型的转换-02值描述类型转换分为隐式转换和显式转换,他们的转换方式都对应了变换、投射、和装箱/拆箱三种类型。当直接将一种类型赋值给另外一个类型,就是隐式转换。系统会在编译时候进行判断,能否进行隐式转换,如果提示出错,就说明无法隐式转换,如果没有提示,这个隐式转换是成立的,并且不会出现错误;接下来就是利用上面三种方式进行转换了。当采取显式转换时,利用诸如(int)a,convert和parse方法吧。这时候有四种情况,一种是编译就出错,因为根本无法强制转换,另一种是可以编译通过,但是运行时候出错,还一种,就是运行也成功了,但是由于截断等原因,结果是不正确的了,最后一种当然就是转换成功喽。其中对于(int)a,编译时候会确保是存在显示转换关系的,如果不存在,就会提示无法转换。如果可以转换,那不会出错,但是结果不一定对,因为可能截断了部分内容;对于Int32.Parse()表示将数字的字符串转换为32位有符号整数,属于内容转换。只要是字符串,都可以转换过去,至于是否正确,运行过程中会提示是否出错,包括空字符串错,格式不对,或者是溢出。基础.NET中,所有类型都继承自System.Object类型,因此可以很容易的获得对象的准确类型,方法是:GetType()方法。转换机制C#中的类型转换机制有两种分类方法:一种是根据转换方式的不同进行划分,可以分为显式(Explicit)转换和隐式(Implicit)转换两种;另外一种是根据源类型和目标类型之间的关系进行划分,可以分为变换(Conversion)、投射(Cast)和装箱/拆箱(Boxing/Unboxing)。隐式转换就是系统默认的、不需要加以特别声明也不用特殊的方法就可以进行的转换。在隐式转换过程中,编译器无需对转换进行详细检查就能够安全地执行转换。-隐式数值转换实际上就是从低精度的数值类型到高精度的数值类型的转换。-隐式枚举转换允许把十进制整数0转换成任何枚举类型,对应其它的整数则不存在这种隐式转换。还是让我们用例子来说明。-隐式引用转换是指一类引用类型之间的转换,这种转换总是可以成功,因此不需要在运行时进行任何检查。-装箱转换允许将“值类型”隐式转换为“引用类型”。显式转换又叫强制类型转换。与隐式转换正好相反,显式转换需要用户明确地指定转换的类型。-它并不是总能成功,而且常常可能引起信息丢失。IS和AS操作符为了避免在进行强制类型转换时由于目标类型无效,而导致运行时抛出InvalidCastException异常,C#提供了IS与AS操作符进行类型判断与“安全”的强制类型转换。is运算符用于检查对象的类型是否与给定类型兼容(对象是该类型,或是派生于该类型)。is的规则如下:检查对象类型的兼容性,并返回结果,true或者false;不会抛出异常;如果对象为null,则返回值永远为false。代码如下:if(studentObjisStudent)as运算符用于执行引用类型的显式类型转换。如果要转换的类型与指定类型兼容,转换就会成功;如果类型不兼容,则返回null。表达式as类型as运算符类似于类型转换,所不同的是,当转换失败时,as运算符将返回null,而不是引发异常。as的规则如下:检查对象类型的兼容性,并返回结果,如果不兼容就返回null;不会抛出异常;如果结果判断为空,则强制执行类型转换将抛出NullReferenceException异常。代码如下:Students1=studentObjasStudent;/如果CLR检测studentProgram引用对象类型不兼容目标类型,即不能进行强制类型转换,则返回一个null,永远不会抛出异常【is与as比较】由代码可以看出,CLR实际会检查两次对象的类型,IS操作符首先检测变量的引用是否兼容于指定的类型,如果返回TRUE,则CLR在进行强制类型转换行进行第二次类型的检测,即studentObj对象是否引用一个Student类型。由于强制类型转换CLR必须首先判断变更引用对象的实际类型,然后CLR必须去遍历继承层次结构,用变量引用类型的每个基类型去核对目标类型。这肯定会对性能造成一定的影响。好在C#提供了AS操作符来弥补这一缺陷。常用的三种显示转换方法(typename)valuename,是通用方法;Convert类提供了灵活的类型转换封装;Parse方法,适用于向数字类型的转换。【三种方法有什么区别】例如,(int),Int32.Parse()和Convert.toInt32()。那么三种方法有什么区别呢?(int)表示使用显式强制转换,是一种类型转换。当我们从int类型到long、float、double或decimal类型,可以使用隐式转换,但是当我们从long类型到int类型转换就需要使用显式强制转换,否则会产生编译错误。也就是说,这个转换方式,编译时会确保是存在显示转换关系的,如果不存在,就会提示无法转换。在对long类型或是浮点型到int类型的显式强制转换中使用,但是如果被转换的数值大于Int32.MaxValue或小于Int32.MinValue,那么则会得到一个错误的结果。Int32.Parse()表示将数字的字符串转换为32位有符号整数,属于内容转换。只要是字符串,都可以转换过去,至于是否正确,运行过程中会提示是否出错。在符合数字格式的string到int类型转换过程中使用,并可以对错误的string数字格式的抛出相应的异常。Convert.ToInt32()则可以将多种类型的值转换为int类型,也可以对错误的数值抛出相应的异常,运行过程中会提示是否出错。投射当源类型和目标类型具有直接或间接的继承关系时,发生的类型转换属于投射。如果将子类型的一个对象转换成祖先类型,则称向上投射(Upcast-多态)。反之,将祖先类型的对象转换为子孙类型,则称向下投射(Downcast)。向上投射可以使用隐式转换,但向下投射必须使用显示转换。这是因为当发生继承关系时,子类将具有父类所有的成员(尽管父类中的private成员在子类中无法访问,但子类确实拥有这些成员),因此子类对象向父类转换时可以确保不会丢失成员,而如果父类对象向子类转换,不一定保证对象具备子类特有的成员。需要注意的是,如果两个类型位于同一继承树中,但没有直接或间接继承关系(通常称这样的类型为“兄弟类型”或“邻居类型”,如上图中的CB和CD、CC和CD),是不允许发生任何转换的,除非重载了类型转换运算符。学习站点问题:WebService-服务器未能识别HTTP头SOAPAction的值-20值描述问题描述WebService+ASP.NET应用程序部署到服务器默认目录中,在IE中用http:/<服务器地址>/<程序目录名>/<默认启动页面名>发生“服务器未能识别HTTP标头SOAPAction的值”错误。解决方法给WebService类添加属性SoapDocumentService(RoutingStyle=SoapServiceRoutingStyle.RequestElement)学习站点cs0016:未能写入输出文件"c:"WINDOWS"Microsoft.NET"值描述20110630问题描述编译错误说明:在编译向该请求提供服务所需资源的过程中出现错误。请检查下列特定错误详细信息并适当地修改源代码。编译器错误消息:CS0016:未能写入输出文件“c:WindowsMicrosoft.NETFrameworkv2.0.50727TemporaryASP.NETFilescms_allerr_testf756608224a9b898App_global.asax.vqizlnw_.dll”-“拒绝访问。”源错误:没有相关的源行原因分析应用程序运行时产生的临时文件需要存放到c:"windows"temp文件夹下而运行基于framework框架下的应用程序需要对temp具有读写的权限,所以程序运行产生的临时文件不能存储或读取,或者路径不存在的情况下都会产生编译错误。解决方法1、设置c:windowstemp目录访问权限temp->属性->安全->添加networkservice->并赋予其权限为读和写->确定(注意:操作系统为windowsserver2003framework版本在1.1及以上)2、设置发布网站的程序目录中bin文件夹的权限同样添加networkservice并设置权限为读取、运行3、执行以上两步操作设置后问题解决。学习站点问题:虚拟目录继承根Web.Config的问题解决-28值描述很多人有时都会为虚拟目录中的web.config继承了主目录中的web.config而苦恼,大部分主要是由于根目录中的web.config添加了httphandler、httpmodule引起的。其实这个问题解决起来很简单,只将httphandlerhttpmodule的声明添加到location中即可。代码<locationpath="."allowOverride="true"inheritInChildApplications="false"><system.web><httpModules><addname="UrlRewriteModule"type="UrlRewritingNet.Web.UrlRewriteModule,UrlRewritingNet.UrlRewriter"/></httpModules></system.web></location>学习站点C#获得客户端的IP,主机名获取当前时间的方法值描述20110531常用方法客户端ip:Request.ServerVariables.Get("Remote_Addr").ToString();客户端主机名:Request.ServerVariables.Get("Remote_Host").ToString();客户端浏览器IE:Request.Browser.Browser;客户端浏览器版本号:Request.Browser.MajorVersion;客户端操作系统:Request.Browser.Platform;服务器ip:Request.ServerVariables.Get("Local_Addr").ToString();服务器名:Request.ServerVariables.Get("Server_Name").ToString();如果你想进一步了解ServerVariables,可以用foreach(StringoinRequest.ServerVariables)Response.Write(o+"="+Request.ServerVariableso+"<br>");代理服务器对于了解代理服务器情况的人,我们会知道,如果用户使用了代理服务器,上述代码获得的是代理服务器的IP地址;如果用户使用了多个代理服务器,则是到达服务器的最后一个代理服务器的IP地址。REMOTE_ADDR访问客户端的IP地址。此项信息用户不可以修改。如果真的给改了的话,你也和服务器连接不了了,服务器就是按照这个来与客户端建立连接并进行通讯的。实际我测试修改这个ServerVariables,一点效果都没有。仍然获得是实际的值。另:Request.UserHostAddress和Request.ServerVariables"REMOTE_ADDR"实际是同一个值。相关问题如何绕过代理服务器获得用户真实的IP地址呢?对于这三个值:REMOTE_ADDR、HTTP_VIA、HTTP_X_FORWARDED_FOR来说,可以分以下五种情况:一、没有使用代理服务器的情况:REMOTE_ADDR=您的IPHTTP_VIA=没数值或不显示HTTP_X_FORWARDED_FOR=没数值或不显示二、使用透明代理服务器的情况:TransparentProxiesREMOTE_ADDR=最后一个代理服务器IPHTTP_VIA=代理服务器IPHTTP_X_FORWARDED_FOR=您的真实IP,经过多个代理服务器时,这个值类似如下:203.98.182.163,203.98.182.163,203.129.72.215。这类代理服务器还是将您的信息转发给您的访问对象,无法达到隐藏真实身份的目的。三、使用普通匿名代理服务器的情况:AnonymousProxiesREMOTE_ADDR=最后一个代理服务器IPHTTP_VIA=代理服务器IPHTTP_X_FORWARDED_FOR=代理服务器IP,经过多个代理服务器时,这个值类似如下:203.98.182.163,203.98.182.163,203.129.72.215。隐藏了您的真实IP,但是向访问对象透露了您是使用代理服务器访问他们的。四、使用欺骗性代理服务器的情况:DistortingProxiesREMOTE_ADDR=代理服务器IPHTTP_VIA=代理服务器IPHTTP_X_FORWARDED_FOR=随机的IP,经过多个代理服务器时,这个值类似如下:203.98.182.163,203.98.182.163,203.129.72.215。告诉了访问对象您使用了代理服务器,但编造了一个虚假的随机IP代替您的真实IP欺骗它。五、使用高匿名代理服务器的情况:HighAnonymityProxies(Eliteproxies)REMOTE_ADDR=代理服务器IPHTTP_VIA=没数值或不显示HTTP_X_FORWARDED_FOR=没数值或不显示,经过多个代理服务器时,这个值类似如下:203.98.182.163,203.98.182.163,203.129.72.215。小结1、REMOTE_ADDR不可被修改,但是可能会获得代理服务器的IP,而不是实际客户端的IP。2、通过HTTP_VIA、HTTP_X_FORWARDED_FOR我们可以获得代理服务器所代理的信息,但是这依靠代理服务器的支持。另外,这两个值可以被修改。我们通过它获得的信息可能是不真实的。另,HTTP_X_FORWARDED_FOR的信息可能是一个集合,不含REMOTE_ADDR中的代理服务器IP。没有一个完美的解决获得客户端IP地址的方法,我们只能在上面2个信息中取舍。学习站点关于Session事件的理解值描述20110531SessionidSessionID是会不停变换的,也就是说一个clientPage并非Sessionid都是保持一致的,除非:1)至少有一个request成功完整地执行2)至少存储一些data在sessionstate中。可以通过session变量或者加上session_onstart来实现。session_onend在InProc模式中支持,也就是说,只在sessiondata在workerprocess中时支持。SessionEnd事件仅在进程内会话模式情况下,请求结束时,Session.Abandon()被调用时会被激发,或者会话过期时被激发。浏览器关闭并不会激发SessionEND事件。相关问题关了浏览器再开,怎么session还在?关了浏览器session当然仍然存在,因为session是储存在服务器端的,而服务器是不可能知道你有没有关掉浏览器。服务器只是简单的保持session接受用户请求,只有当session一段时间没有被请求(比如30分钟以后),服务器才会把session作废。客户端与服务器交互session的时候,客户端会生成一个cookie,这个cookie包含了当前session的ID号。你再次打开浏览器的时候,浏览器会发送这个ID号,如果此时session还没失效的话,服务器就能通过ID号识别出你,从而继续交互session。一般来讲如果服务器关闭,那么所有的session都会消失。还有,session的setAttribute根本不是用来设置session的过期时间的。设置过期时间是在web.xml里面,或者session的setMaxInactiveInterval方法。学习站点nullobject模式-详见设计模式学习-提高篇值描述20110513这个模式的出现还是了为了解决代码重复的坏味道。场景在项目中很经常见到类似下面这样的代码:显然,代码重复是坏味道,怎么消除这个坏味道呢?答案就是使用NullObject替代之,NullObject继承原对象。如下:那么,原来的代码可以改写为:去掉了坏味道,但还不完善:注意技巧,我们可以在NullObject覆写getCost,提供缺省值:这样上面的判断语句也可以去掉了!plan.setCost(prj.getCost();在需要返回NullObject的地方,你应该创建一个nullobject以替代一般的对象,我们可以建立一个工厂方法:优点NullObject模式带来的好处:减少了检查对象是否为null的代码重复,提高了代码的可读性,通常这些NullObject也可以为单元测试带来简便。学习站点C#Lock()语句-13值描述20110513MSDNlock关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁。lock确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。通常,应避免锁定public类型,否则实例将超出代码的控制范围。最佳做法是定义private对象来锁定,或privatestatic对象变量来保护所有实例所共有的数据。单例模式相关问题【问题】问lock那里的object实例可以直接用instance替代吗?new一个object是否多余?【解答】程序运行到lock的时候,抛出ArgumentNullException异常,“值不能为null”。【分析】见msdn中的定义“lock确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放”,注意标红部分,可以确定是不可以的,因为当对象未实例化时是null,而null只是一个空引用。学习站点认识全面的null-13值描述201105131、 从什么是null开始?用于标识变量引用的一种状态,这种状态表示没有引用任何对象实例,也就是表示“什么都没有”,既不是Object实例,也不是User实例,而是一个空引用而已。在.NET中,null表示一个对象引用是无效的。作为引用类型变量的默认值,null是针对指针(引用)而言的,它是引用类型变量的专属概念,表示一个引用类型变量声明但未初始化的状态。在.NET中,对null有如下的基本规则和应用:null为引用类型变量的默认值,为引用类型的概念范畴。null不等同于0,"",string.Empty。引用is或as模式对类型进行判断或转换时,需要做进一步的null判断。判断一个变量是否为null,可以应用=或!=操作符来完成。2、 对任何值为nul的l变量操作,都会抛出NullReferenceException异常。Nullable<T>(可空类型)以下代码在本质上是完全等效的:int?i=null;Nullable<int>i=null;可空类型的意义在于,通过Nullable<T>类型,.NET为值类型添加“可空性”,例如Nullable<Boolean>的值就包括了true、false和null,而Nullable<Int32>则表示值即可以为整形也可以为null。同时,可空类型实现了统一的方式来处理值类型和引用类型的“空”值问题,例如值类型也可以享有在运行时以NullReferenceException异常来处理。在本质上Nullable可以看着是预定义的struct类型。对于可空类型,同样需要必要的小结:可空类型表示值为null的值类型。不允许使用嵌套的可空类型,例如Nullable<Nullable<T>>。Nullable<T>和T?是等效的。对可空类型执行GetType方法,将返回类型T,而不是Nullable<T>。c#允许在可空类型上执行转换和转型,例如:int?a=100;Int32b=(Int32)a;a=null;同时为了更好的将可空类型于原有的类型系统进行兼容,CLR提供了对可空类型装箱和拆箱的支持。3、 ?运算符4、 ?运算符,又称为null-coalescingoperator,如果左侧操作数为null,则返回右侧操作数的值,如果不为null则返回左侧操作数的值。它既可以应用于可空类型,有可以应用于引用类型。NulllObject模式解决什么问题?简单来说,nullobject模式就是为对象提供一个指定的类型,来代替对象为空的情况。说白了就是解决对象为空的情况,提供对象“什么也不做”的行为,这种方式看似无聊,但却是很聪明的解决之道。举例来说,一个User类型对象user需要在系统中进行操作,那么典型的操作方式是:if(user!=null)manager.SendMessage(user);这种类似的操作,会遍布于你的系统代码,无数的if判断让优雅远离了你的代码,如果大意忘记null判断,那么只有无情的异常伺候了。于是,Nullobject模式就应运而生了,对User类实现相同功能的NullUser类型,就可以有效的避免繁琐的if和不必要的失误:二者的差别体现在哪儿呢?其实主要的思路就是将nullvalue转换为nullobject,把对user=null这样的判断,转换为user.IsNull虽然只有一字之差,但是本质上是完全两回事儿。通过nullobject模式,可以确保返回有效的对象,而不是没有任何意义的null值。同时,“在执行方法时返回nullobject而不是null值,可以避免N

    注意事项

    本文(C学习-常见问题与重要概念-高级软件工程师必须知道的复习进程.doc)为本站会员(1595****071)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开