




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一、最小化窗口点击“X”或“AltF4”时,最小化窗口,如:protectedoverridevoidWndProc(refMessagem){constintWM_SYSCOMMAND=0x0112;constintSC_CLOSE=0xF060;if(m.Msg==WM_SYSCOMMAND&&(int)m.WParam==SC_CLOSE){//Userclickedclosebuttonthis.WindowState=FormWindowState.Minimized;return;}base.WndProc(refm);}二、如何让Foreach循环运行的更快foreach是一个对集合中的元素进行简单的枚举及处理的现成语句,用法如下例所示:usingSystem;usingSystem.Collections;namespaceLoopTest{classClass1{staticvoidMain(string[]args){//createanArrayListofstringsArrayListarray=newArrayList();array.Add("Marty");array.Add("Bill");array.Add("George");//printthevalueofeveryitemforeach(stringiteminarray){Console.WriteLine(item);}}}你可以将foreach语句用在每个实现了Ienumerable接口的集合里。如果想了解更多foreach的用法,你可以查看.NETFrameworkSDK文档中的C#LanguageSpecification。在编译的时候,C#编辑器会对每一个foreach区域进行转换。IEnumeratorenumerator=array.GetEnumerator();try{stringitem;while(enumerator.MoveNext()){item=(string)enumerator.Current;Console.WriteLine(item);}}finally{IDisposabled=enumeratorasIDisposable;if(d!=null)d.Dispose();}这说明在后台,foreach的管理会给你的程序带来一些增加系统开销的额外代码。三、将图片保存到一个XML文件WinForm的资源文件中,将PictureBox的Image属性等非文字内容都转变成文本保存,这是通过序列化(Serialization)实现的,例子://usingSystem.Runtime.Serialization.Formatters.Soap;Streamstream=newFileStream("E:\\Image.xml",FileMode.Create,FileAccess.Write,FileShare.None);SoapFormatterf=newSoapFormatter();Imageimg=Image.FromFile("E:\\Image.bmp");f.Serialize(stream,img);stream.Close();四、屏蔽CTRL-V在WinForm中的TextBox控件没有办法屏蔽CTRL-V的剪贴板粘贴动作,如果需要一个输入框,但是不希望用户粘贴剪贴板的内容,可以改用RichTextBox控件,并且在KeyDown中屏蔽掉CTRL-V键,例子:privatevoidrichTextBox1_KeyDown(objectsender,System.Windows.Forms.KeyEventArgse){if(e.Control&&e.KeyCode==Keys.V)e.Handled=true;}ps:网上摘抄,看了以后感觉不错,以后碰见好的再陆续发布Tags:dotnet技术,c#开发技术ASP.NET2.0中使用webpart系列控件Dot-Net技术|阅读(144)|评论(0)Oct292005[此文来源于互联网,牛C网只负责收集整理]在现在的网站设计中,更强调的是用户的个性化设置,让用户可以自由的设置符合自己喜好的页面成为网站开发人员的头号难题,不过现在看来这个难题微软帮我们解决了。在2.0中新增加了一系列webpart控件,可以让用户很方便地对网页的各区域布局进行调整。在一些web应用程序中,如果用户想自定义页面布局,比如一个新闻发布系统,想让左,中,右三栏的位置进行调换的话,就可以使用webpart控件。下面,我们来看下2.0中webpart系列控件的一些基本用法。首先,在2005中的工具箱中,可以找到如下图所示的webpart系列控件,有很多个,限于篇幅,本文介绍其中的一些重要的控件:在webpart系列控件中,其中的webpartmanager控件用于统一管理各webpart控件。而webpartzone控件,则是提供了各区域划分,在这些区域中,用户可以往里面放置各式各样的控件,而当运行的时候,用户可以移动的就是这些webpartzone控件所在的区域。为增强认识,我们先做个简单的例子。1、首先使用2005beta2(或者RC1)新建一个web站点,2、往窗体中拖拉一个webpartmanager控件,再建一个3列1行的表格,分别往每个单元格里拖拉一个webpartzone控件,如下图:3、往webpartzone1中拖拉放一个日历控件,并为这个日历控件选择一个合适的样式4、切换到代码视图状态,将日历控件的title属性改为:today’sdate。注意的是,日历控件本身没有title属性,但当一个控件加入到webpartzone区域中去后,则该控件被自动包装为GenericWebPart类型控件,这些类型的控件有title属性。5、这时,我们可以按F5来运行该程序,运行如下图所示,可以看到,区域的右上角有最小化和关闭,恢复的按钮。接下来,我们介绍如何在webpart系列控件中,使用用户自定义的控件。1、首先,我们为工程项目增加一个"google.ascx"的控件,并且在images目录下,添加google那张著名的logo图片。接着,往窗体中添加一个2*2行的表格,再往其中的一个单元格添加一个image图象控件,指定其图象为google.gif,再添加一个文本框,一个按钮,如下图所示,其中,括号内的是该控件的名称:3、在btnsearch按钮的click事件中写入如下代码:Response.Write(Page.IsValid)DimqueryStrAsString=HttpUtility.UrlEncode(txtSearch.Text)Response.Redirect("/search?q="&queryStr)EndSub4、这时,将写好的google.ascx控件,整个拖拉到我们刚才建立好的表格中的中间那个单元格,如下图所示:我们并且修改代码如下,修改其名称为googleserach:<uc1:Googletitle="GoogleSearch"runat="server"ID="Google1"/>接下来,F5运行,可以看到,可以在googlesearch所在的webpart里进行google搜索了。同时,如果觉得webpart的那些关闭,恢复,最小化的按钮不大好看,还可以自定义按钮,比如在images目录下,添加下面的图片:然后,在webpartzone1的属性中,指定如下的属性就可以了。CloseVerb.ImageUrl="Images/CloseVerb.gif"EditVerb.ImageUrl="Images/EditVerb.gif"MinimizeVerb.ImageUrl="Images/MinimizeVerb.gif"RestoreVerb.ImageUrl="Images/RestoreVerb.gif"使webpart动起来上面设计的webpart还没能动起来,要让webpart动起来的话,必须要将webpar设置为designdisplay模式。先为webpart添加下面的radiobutton选择框<asp:RadioButtonListID="rblMode"runat="server"AutoPostBack="True"><asp:ListItem>BrowseDisplayMode</asp:ListItem><asp:ListItem>DesignDisplayMode</asp:ListItem></asp:RadioButtonList>并且在code-behind的代码中,写入如下代码:ProtectedSubRadioButtonList1_SelectedIndexChanged(ByValsenderAsObject,_ByValeAsSystem.EventArgs)_HandlesrblMode.SelectedIndexChangedSelectCaserblMode.SelectedIndexCase0:WebPartManager1.DisplayMode=WebPartManager.BrowseDisplayModeCase1:WebPartManager1.DisplayMode=WebPartManager.DesignDisplayModeEndSelectEndSub运行上面代码,选择designdisplaymode,则可以象下图那样,自由拖动webpart,要注意的是,当移动各webpart的位置后,即使关掉浏览器,下次重新打开时,依然可以看到各个控件保持原来的位置。其实,2.0是使用在aspnetdb.mdf中的一个叫aspnet_PersonalizationPerUser的表来保存数据的,表的结构如下所示:FieldValueId928e121a-4042-4fb4-9520-21210b9b37c1PathId7c3b5dc0-04d0-48a2-bbb2-2b70286f22feUserId9bff14df-024f-4bda-9a0a-b4a19ab9e387PageSettings<Binarydata>LastUpdatedDate10/06/20054:44:05AM如果想恢复各控件的原来位置,只需要将该数据表中相应的行删除掉就可以了。但有个问题是,如果使用每一个webpart的关闭按钮,则很难再将其恢复(当然删除数据表中的行,但十分麻烦)。在2.0中,提供了另一种webpart,叫做catlogzone控件,下面介绍其用法:1、往窗体中拖拉一个catlogzone控件,如下图所视。2、往该catlogzone控件区域中,再拖放三个webpart系列的控件,分别是DeclarativeCatalogPart,PageCatalogPart,andImportCatalogPart,如下图所示。其中,DeclarativeCatalogPart控件的作用是,显示目前页面上有哪些可以用的webpart控件;PageCatalogPart的作用是,可以让用户通过勾选的方式,选定将哪些控件添加转移到其他webpart区域中去。ImportCatalogPart则可以通过外部磁盘文件的方式,加载其他做好了的webpart部件。3、在radiobutton区域中,修改以下代码,增添一个catalogdisplay的显示模式:<asp:RadioButtonListID="rblMode"runat="server"AutoPostBack="True"><asp:ListItem>BrowseDisplayMode</asp:ListItem><asp:ListItem>DesignDisplayMode</asp:ListItem><asp:ListItem>CatalogDisplayMode</asp:ListItem></asp:RadioButtonList>然后,在code-behind的代码中,将代码修改为如下:ProtectedSubrblMode_SelectedIndexChanged(_ByValsenderAsObject,_ByValeAsSystem.EventArgs)_HandlesrblMode.SelectedIndexChangedSelectCaserblMode.SelectedIndexCase0:WebPartManager1.DisplayMode=WebPartManager.BrowseDisplayModeCase1:WebPartManager1.DisplayMode=WebPartManager.DesignDisplayModeCase2:WebPartManager1.DisplayMode=WebPartManager.CatalogDisplayModeEndSelectEndSub4、在DeclarativeCatalogPart任务菜单上,点击右上角的智能感知按钮,然后选"edittemplates"的链接,进入模版编辑状态,如下图:再往其中的webpartstemplate区域中拖拉一个google.ascx控件,如下图,这将允许用户在运行时,可以自由地往页面增加这样的google搜索控件。5、然后修改代码如下:<ZoneTemplate><asp:DeclarativeCatalogPartID="DeclarativeCatalogPart1"runat="server"><WebPartsTemplate><uc1:Googletitle="GoogleSearch"ID="Google2"runat="server"/></WebPartsTemplate></asp:DeclarativeCatalogPart>6、运行程序,可以看到,当选择catalogdisplaymode时,会显示如下图所示的catalogzone,其中列出了当前可用的有哪些webpart控件,我们可以把这个google的控件加到其他的webpart区域,也可以尝试将已经存在的webpart控件关闭,然后在catalogzone区域中的控件列表中,把它们再加回到页面中去。此外,在运行期间,还可以动态地修改webpart控件的外观等属性,如下:1)往窗体中添加一个editorzone的区域控件,往其中再拖放一个appearanceEdiotrPart控件,该控件可以在运行时,让用户动态改变各webpart控件的属性。2)我们再修改radiobutton选择框的代码如下,则加一个编辑模式:<asp:RadioButtonListID="rblMode"runat="server"AutoPostBack="True"><asp:ListItem>BrowseDisplayMode</asp:ListItem><asp:ListItem>DesignDisplayMode</asp:ListItem><asp:ListItem>CatalogDisplayMode</asp:ListItem><asp:ListItem>EditDisplayMode</asp:ListItem></asp:RadioButtonList>3)修改code-behind代码如下:ProtectedSubrblMode_SelectedIndexChanged(ByValsenderAsObject,ByValeAsSystem.EventArgs)_HandlesrblMode.SelectedIndexChangedSelectCaserblMode.SelectedIndexCase0:WebPartManager1.DisplayMode=WebPartManager.BrowseDisplayModeCase1:WebPartManager1.DisplayMode=WebPartManager.DesignDisplayModeCase2:WebPartManager1.DisplayMode=WebPartManager.CatalogDisplayModeCase3:WebPartManager1.DisplayMode=WebPartManager.EditDisplayModeEndSelectEndSub4)运行程序,选择editdisplaymode模式,这时,会发现每个控件的右上角,会多了一个"edit"的按钮,点该按钮,弹出如下图的窗体,用户可以修改每个控件的外观等属性。最后,我们看下,webpart控件之间还可以进行相互之间的通信,下面的例子中,要实现的是,在一个日历控件中点选某一个日期,会在已经做好的googlesearch的webpart控件的文本框中显示其日期,达到通信的目的,下面介绍其实现步骤:1、为了使两个webpart控件之间进行通信,必须先声明一个公共的接口。往工程项目里增加一个叫ISelectedDate.vb的类文件,放在app_code目录下,写入如下代码:ImportsMicrosoft.VisualBasicPublicInterfaceISelectedDateReadOnlyPropertySelectedDate()AsDateEndInterface这里,我们返回一个只读的日期属性selectedDate.2、再创建一个日历控件CalendarUC.ascx,其中拖拉一个普通的日历控件即可。然后写入如下代码:PartialClassCalendarUC_ascxImplementsISelectedDatePublicReadOnlyPropertySelectedDate()AsDateImplementsISelectedDate.SelectedDateGetEndGetEndProperty<ConnectionProvider("SelectedDate","SelectedDate")>_PublicFunctionGetSelectedDate()AsISelectedDateReturnMeEndFunctionEndClass上面的代码,首先实现了已经声明了的IselectedDate接口,要留意的是<ConnectionProvider("SelectedDate","SelectedDate")>中的写法。由于在这个例子中,日历控件要为其他的控件提供信息,因此,该日历控件是一个provider(提供者),而另外的接收信息的控件,是consumer(消费者)。而两者为了要通信,必须要提供一个通信接入点,就象一个电插头,要找到合适的电插板一样。因此,<ConnectionProvider("SelectedDate","SelectedDate")>中的第一个参数,定义了两者的接口点,第二个参数,则是要传递给consumer的参数,本例是selectedDate。3、接下来,我们在已经做好的google.ascx控件的代码中,编写如下代码:Private_selectedDateAsISelectedDate<ConnectionConsumer("SelectedDate","SelectedDate")>_SubsetSearchText(ByValSearchTextAsISelectedDate)Me._selectedDate=SearchTextEndSubProtectedSubPage_PreRender(ByValsenderAsObject,ByValeAsSystem.EventArgs)HandlesMe.PreRenderIf_selectedDateIsNotNothingThenEndIfEndSub可以看到<ConnectionConsumer("SelectedDate","SelectedDate")>的定义必须和provider中的定义一样。4、再修改如下代码,将两个控件的命名变得通俗易懂<ZoneTemplate><uc1:Googletitle="GoogleSearch"runat="server"ID="Google1"/><uc3:CalendarUCtitle="CalendarWebPart"runat="server"ID="CalendarUC1"/></ZoneTemplate>5、最后,为了使两者能互相通信,必须在default.aspx页中修改如下代码:<asp:WebPartManagerID="WebPartManager1"runat="server"><StaticConnections><asp:WebPartConnectionID="Connection"ProviderID="CalendarUC1"ProviderConnectionPointID="SelectedDate"ConsumerID="Google1"ConsumerConnectionPointID="SelectedDate"/></StaticConnections></asp:WebPartManager>6、在页面代码中,增加一个radiobutton,用作显示connection模式,并写入如下代码:Case4:WebPartManager1.DisplayMode=WebPartManager.ConnectDisplayMode7、运行程序,选择connectdisplaymode模式。再选择GOOGLESEARCH的那个webpart控件,点右上角的"conenct"按钮,此时,会显示如下图所示,提示你要选择从那个控件中得到信息,这里选择日历控件,按确定。那么,当点选日历控件的某个日期值的时候,GOOGLESEARCH的那个文本框里,就会显示相应的日期了。小结:本文主要介绍了在2.0中,如何使用基本的webpart系列控件,以达到改变页面布局以及如何使页面的各webpart控件相互之间通信。Tags:dotnet技术,c#开发技术用C#与XML创建动态分层菜单Dot-Net技术|阅读(164)|评论(0)Oct282005[此文来源于互联网,牛C网只负责收集整理]Author:unknownFrom:Internet从在复杂的B2B交易中的交换数据到为应用程序提供配置文件结构,XML在许多方面大显身手!由于XML不断地获得软件的支持,我们完全能够预见:XML的应用将不断增加。本文就介绍这样一种应用程序,它使用XML创建类似于Windows开始菜单的分层菜单系统,从而向终端用户提供更满意的Web体验。这个应用程序将使用C#、XML和服务器端Microsoft.Net框架,创建一个DHTML结构,IE4或更高版本的浏览器可以操作它并在客户端动态显示。由于我们可以快速地访问服务器上的XML,并且XML能够描述层次之间的关系,因此它成为标记“父/子菜单”数据的一个最佳选择。(一个三层菜单系统,可点击放大)除了学习如何使用XML创建一个菜单应用程序外,我们还要介绍.Net框架的主要XML类,它们位于System.Xml集合中。什么是.Net集合(Assembly)要在C#文件中使用XML,就必须引用一个特定的名称空间。.Net平台中的一个名称空间是作为一个程序组件的组织系统使用的,它对于解决命名冲突很重要,这一点很象XML中的名称空间。这个基于XML的菜单系统是用位于System.Xml集合中的System.Xml名称空间创建的。.NetSDK是这样定义集合的:一个集合就是一个类型和资源的汇集信息,这些类和资源一起使用,形成一个功能的逻辑单元,即一个“逻辑”dll。一个集合需要许多物理文件,如界面、类、资源文件等等,并且创建了关于文件如何一起工作的元数据。集合中还可能包含版本及安全信息。集合有许多好处,其中之一就是可以在ASP.NET应用程序中使用,而无须用regsvr32.exe向注册文件中增加一个类识别号(CLSID)。这样以来,集合的升级操作与将适当的集合复制到一个ASP.NET应用程序的bin目录中一样简单。现在我们就来仔细看一看那些建立在System.Xml名称空间和集合中的类。如果你以前使用过Microsoft的MSXML3分解器,就会发现使用System.Xml集合中的类相当简单。这里的菜单应用程序只使用了这些主要集合类中的一部分:XmlNode、XmlDocument、XmlNodeList、XmlNamedNodeMap、DocumentNavigator、XmlTextReader和XmlTextWriter。XmlDocument、XmlNodeList和XmlNode类用来创建传递给客户端浏览器的菜单应用程序的结构。用XmlDocument类以一种安全线程(thread-safe)的方式从服务器上装载和分解本地或远程XML文档。建立在一个字符串中的XML标记也可以被装载或分解,从而在一个文档中创建、移动节点或取消节点的移动。XmlNodeList类可以使我们列举一个节点的集合来访问一个特定属性,如名称、值或名称空间。最后,XmlNode类可以用来在XML文档中向一个用于检验的XmlNode对象分配一个特定节点。XmlNamedNodeMap类用来列举建立在一个元素类型选择中的属性集合。DocumentNavigator、XmlTextReader和XmlTextWriter类提供与XML一起使用所需要的额外功能。要特别说明的是,DocumentNavigator可以用来执行XPath查询,它被包含在XSLT转换中。XmlTextReader类提供对XML节点的只向前(forward-only)、无缓存的访问,从而使XML节点对大型XML文档也同样生效。XmlTextWriter类提供一个快速、只向前的指针模型,实现将XML内容写到一个流或一个文件中的目的。在菜单应用程序中使用的XML文档相对来说是较小的,因此我们可以在服务器端使用文档对象模式(DOM)来存取XML文档中的不同节点。当分解大型XML文档时,就需要使用XmlTextReader类所含有的只向前模型。XML代码菜单应用程序使用了3个XML文档:menuItems.xml、menuItems2.xml和menuItems3.xml,它们用于标记单独的菜单项目。XML的处理和操作由一个叫做xmlMenus.dll的集合完成,这个集合被服务器端的一个ASP.NET文件createMenus.aspx所使用。在客户端的动态HTML(DHTML)内容使用了一个层叠格式表文件和一个JavaScript文件,这些文件联合在一起生成了本文开始部分的图示结果。我们在List1的代码显示了用来标记单独菜单项目的XML文档的一部分。文档中的主元素命名为menuItem,它可以包含一个名字和超级链接元素以及额外的menuItem子元素。这种关系可以用来创建包含子菜单的菜单系统,就象Windows的开始菜单一样。由于XML已经标出了分层关系,因此就可以利用循环在不同元素之间行走:当使用XmlDocument、XmlNode和XmlNodeList类创建子节点时,我们可以反复调用WalkTree()函数以颠倒父/子关系。其它的类如ArrayList和StreamWriter用于将相关菜单归类到数组中,然后在适当时间将所生成的菜单结构写入一个文件中。XmlMenus集合的代码开始时要声明一个XmlHierMenu名称空间,接下来要引用System、System.Xml、System.Collections和System.IO名称空间:usingSystem;usingSystem.Xml;usingSystem.Collections;usingSystem.IO;在这部分代码之后要创建3个构造器。一个构造器不接收变量,只对变量进行初始化。下一个构造器接收一个图象文件的定制路径。最后一个构造器在不经常对XML菜单进行刷新的情况下,允许将由集合生成的输出存储到一个文件中。最后一个构造器所生成的文件可以被静态地包含在一个ASP.NET文件中,而不是在各个Web页面请求时随时地生成。在构造器之后,开始定义CreateMenu()方法,具体请看List2中的代码。这个方法负责进行XML文档的装载和解析,找到根节点,然后在根的子节点之间循环。如果发现一个子节点本身还有子节点,就调用WalkTree()方法,并且把这些子节点都传递到其中。如果这些子节点还有子节点,就再次调用WalkTree()。这个过程循环进行直到不再发现增加的子节点。Walktree()方法的代码可以参看List3。在调用WalkTree()方法并且对不同的节点进行分析的同时,要解析menuItem节点,将来自其超级链接和名字节点的数据放在数组列表中。对整个XML文档都进行解析之后,数组列表的内容就被传递回调用的ASP.NET的页面,然后使用Response对象写出信息。从这时起,客户端的JavaScript代码就开始控制DHTML菜单了。在服务器端,我们使用一个ASP.NET页面来开始菜单的创建过程。这个页面输入了与集合相关联的名称空间XmlHierMenu:<%@pagelanguage="C#"%><%@ImportNamespace="XmlHierMenu"%>然后,将样式表文件和JavaScript文件包含在文件的代码区中。最后,在ASP.NET页面底部的代码用来引用上面提到的CreateMenu()方法与WalkTree()方法,请看List4。在ASP.NET页面中所找到的C#代码只是建立了到不同的XML文档的路径,并且对XmlMenu类进行了例示。一旦对这个类进行了例示,就对CreateMenu()方法进行调用。这个方法接收菜单名以及到这个菜单的XML文档的文件路径。在本例中,要创建3个名为menu1、menu2和menu3的菜单,然后在一个ASP.NET页面中使用。这个应用程序在一个给定页面中可以支持无穷多的菜单,但是我们建议菜单数目不要过多,因为每增加一个菜单,发送到客户端的文件规模都会增加。编译C#文件现在我们已经看到了菜单应用程序的结构,接下来讨论一下使用哪些开关可以将C#文件编译到一个集合中。在.NetSDK文档中,我们可以查询到一个所有编译开关的完整列表。要想正确地编译C#文件以使它能用于一个ASP.NET页面中,编译器就必须要知道包含了System.Xml集合。这可以通过使用/r开关并在后面加上到集合的完整路径来完成。由于将要创建的dll是一个库,因此就必须指定/t开关,这样编译器就不再寻找一个静态的Main()方法。最后一个需要的开关是/out,它将告诉编译器输出的文件名是什么,以及将其放在哪里。所有对C#编译器的调用都以csc(C#编译器)开始,然后指定适当的开关。编译器语法的最后一部分包括到已创建的.cs文件的路径。请看下面的编译文件的完整语法格式:C:\>csc/r:System.Xml.dll/t:library/out:d:\inetpub\wwwroot\xml\bin\xmlMenus.dlld:\inetpub\wwwroot\xml\menus\xmlMenus.cs这行命令告诉编译器包含System.Xml集合、将文件作为一个库进行编译、将文件输出到bin目录中、输入文件命名为xmlMenus.cs,输出文件名叫xmlMenus.dll。当输入回车键后,.cs文件就进行编译,生成的dll将被放置在适当的文件夹中。结束语本文通过讲解一个应用程序的思路及实现代码,使我们对于使用Microsoft.Net平台中的一些集合和类有了一个很好的了解。随着进一步的学习,我们将看到,还会有其它一些集合和类可以以多种方式与本地和远程XML文档一起工作。Tags:dotnet技术,c#开发技术C#语言函数参数的传递Dot-Net技术|阅读(118)|评论(0)Oct282005[此文来源于互联网,牛C网只负责收集整理]就像C语言众多的后世子孙一样,C#的函数参数是非常讲究的。首先,参数必须写在函数名后面的括号里,这里我们有必要称其为形参。参数必须有一个参数名称和明确的类型声明。该参数名称只在函数体内部可见。因此在该函数体以外的任何地方使用同样的变量名是不会引起冲突的。每当调用函数的时候,必须将一个实参传递给函数定义中的形参。默认情况下,C#的参数传递是值传递。这种方式的优点和缺点同样明显。另外,在传送引用类型的时候还时不时引起一些小误会。更加使人困惑的是,既然CLR不支持指针类型,那么我们以前在C/C中的那些关于指针传递的妙用应该如何实现呢?不必发愁,本文将会逐一回答上述这些疑问。首先我们会讨论默认情况下的值传递以及这种方式的优缺点,解释默认情况下传递引用类型时容易产生的误解。然后,我们讨论如何利用ref关键字把一个值类型作为引用类型传递给参数。最后,我们尝试着让一个函数可以返回多个值,在C/C中我们经常利用指针达到这一目的,这里我们将会利用out关键字重温这种美妙的感觉。值传递每当调用一个函数的时候,我们就必须为该函数的每一个形参传递一个实参。默认情况下,采用值传递的机制。也就是说,实参的值会被拷贝到形参里面,这样我们在函数内部得到一个本地变量,该变量的值和传递进来的那个实参的值相等,但是它们存放在不同的存储空间。因此,我们对函数参数所做的一切实际上都是对函数提内本地变量的操作,绝对不会影响到作为实际参数传递过来的那个函数体外的变量。看下面的例子,我就不再多费口舌了。usingSystem;namespaceCS语言函数参数的传递{///<summary>///Class1的摘要说明。///</summary>classExample{staticvoidMain(string[]args){intargument=5;Exampleexp=newExample();System.Console.WriteLine(argument);exp.fun1(argument);System.Console.WriteLine(argument);}publicExample(){}publicvoidfun1(intparameter){//对parameter的操作实际上是对本地变量的修改//不会影响到函数体外作为实参传递过来的变量parameter=5;System.Console.WriteLine(parameter);}}}但是值传递的机制有一个明显的缺点。主要表现在值类型的传递方面。我们对参数的修改会在函数体执行结束之际消失。如果我们希望将这种变化影响到作为实参传递过来的那个函数体以外的变量就必须把值类型作为引用类型传递。后边会具体讨论。值传递机制的另一个缺点,或许你会认为这是一个优点,表现在引用类型的传递方面。按照值传递的机制传递一个引用类型的变量,实际上只是完成了一次浅拷贝。请不要误认为对整个对象进行了深拷贝。函数参数得到的只是实参的handle的值。也就是说,本地的参数实际上只是一个引用类型的handle,和作为实参传递过来的那个变量的handle具有相同的值,指向同一个object(两个handle指向堆上的相同位置)。这样我们在函数内部对参数所做的修改会直接影响到堆上的object。当函数结束之后,本地的参数消失,而对于堆上的object的修改会成为持久的修改而继续保留下来。把值类型作为引用类型传递有一些时候,我们不惜望函数对于参数的修改随着函数的结束而消失。作为引用类型,作到这一点其实一点都不难,就像我们上面说的那样。但是,如果是值类型的参数,似乎就有一点麻烦了。从前在C/C里面可以采取传递指针的方法来达到这个目的。但是CLR已经明确取消了指针。作为补偿,C#为我们提供了ref关键字。ref关键字通知编译器,参数的实参是作为引用类型而非值类型进行传递。下面的这段程序帮助我们说明问题。usingSystem;namespaceCS语言函数参数的传递{classExample{staticvoidMain(string[]args){intargument=5;Exampleexp=newExample();//首先显示argumentSystem.Console.WriteLine(argument);exp.fun2(refargument);//传递参数时必须使用ref关键字System.Console.WriteLine(argument);System.Console.ReadLine();}publicvoidfun1(intparameter){//对parameter的操作实际上是对本地变量的修改//不会影响到函数体外作为实参传递过来的变量parameter=5;System.Console.WriteLine(parameter);}publicvoidfun2(refintparameter){parameter=5;System.Console.WriteLine(parameter);}}}函数fun2要求一个int类型的参数,并且伴有关键字ref。在Main()函数内定义了一个整形变量argument,它将会作为实参传递给函数fun2()。在调用该函数之前,首先显示了变量argument,其值等于5。紧接着调用函数fun2(),并且传递argument给参数parameter。这时函数得到的是一个本地的,指向整形变量argument的handle。在函数内部,把parameter加5,然后显示它。这时其值为10。函数返回后再一次显示argument,其值同样为10。让函数返回多个返回值有些时候我们可能会希望一个函数可以返回多个返回值。事实上,这是不可能的因为一个函数只能返回一个返回值。但是我们确实办法达到这种效果。最简单的是下面这种方法。publicintfun3(refinti,intj){i=j;returnij;}我们这样调用这个函数。inti;intsum=exp.fun3(refi,10);System.Console.WriteLine(i);System.Console.WriteLine(sum);这样在执行过函数fun3()之后,我们实际上得到了i的值和ij的值。实际上起到了利用一个函数返回两个值的作用。另外有一个关键字也是非常重要的。那就是out关键字。该关键字允许向参数传递一个没有分配空间的引用类型。利用这个关键字同样可以达到返回多个值的目的。publicvoidfun4(refinti,outobjectobj){i=5;obj=i.ToString();System.Console.WriteLine(i);System.Console.WriteLine(obj);}上面这个方法要求两个参数。第二个参数要求一个object类型的变量。该参数前面有一个out关键字。编译器会认为该参数的实参没有被分配存储空间。Out参数在未被赋值之前不能使用。可以这样调用该函数:inti=5;objectobj;exp.fun4(refi,outobj);System.Console.WriteLine(i);System.Console.WriteLine(obj);输出为4个10。说明我们在调用该函数之后得到了变量i和obj两个变量的值。Tags:dotnet技术,c#开发技术使用C#语言操作ADO数据库Dot-Net技术|阅读(125)|评论(0)Oct282005[此文来源于互联网,牛C网只负责收集整理]访问数据库是大多数应用程序的一部分,而且随着C#和ADO.NET的发布,这个过程已经变得相当的简单.本文将展示下面四个基本的数据库操作:1.读数据.这包括诸如整数,字符串和日期等不同的数据类型.2.写数据.就象读数据一样我们会写这些通常的数据类型.这是通过SQL语句来实现的.3.更新或是修改数据.我们还是使用简单SQL语句.4.删除数据.使用SQL.这些操作是对一个微软Access2000数据库进行的,但是SQL或是其它ADO数据源可以通过简单的改变连接字符串来使用.开始第一步为了使用ADO类,我们需要包括进ADO.NET命名空间(namespace)和一些精巧的日期类.在你要进行数据库操作的地方加入下列几行代码.它应该被放置在命名空间引入代码行的下面而在类定义的上面.usingSystem.Data;//申明变量usingSystem.Data.ADO;//数据库usingSystem.Globalization;//日期根据你所参与的工程的类型,你可能需要增加对System.Data命名空间的引用.你可以根据在你添加上面的代码以后编译器是否产生错误来判断.要添加System.Data命名空间,你可以:1.在Solutionexplorer-References分支中右键单击.2.选择"添加引用"3.选择.NETFramework标签.4.双击System.data.dll条目5.单击OK6.System.Data现在应该出现在了Solutionexplorer的引用列表中了.因为连接字符串在大多数操作中都要使用,所以我建议你将它设置成你要编写的类的成员.注意:在你的程序中,数据库文件的路径有可能不同.//属性publicconststringDB_CONN_STRING="Driver={MicrosoftAccessDriver(*.mdb)};""DBQ=D:\\CS\\TestDbReadWrite\\SimpleTest.mdb";读数据现在一切都变得有趣起来.读数据可以通过ADODataReader类来实现.(参看ChrisMaunder的文章"ADO.NETADODataReader类"来获取关于这个类的更多信息.)读数据的步骤如下:1.我们用ADOConnection来打开一个数据库.ADOConnectionconn=newADOConnection(DB_CONN_STRING);conn.Open();2.我们编写一个SQL语句来定义将要取出的数据.这个数据执行的结果是返回一个ADODataReader对象.注意Execute方法中的out关键字.这在C#中意味着通过引用传递参数.ADODataReaderdr;ADOCommandcmd=newADOCommand("SELECT*FROMPerson",conn);cmd.Execute(outdr);3.我们循环遍历ADODataReader中的每一个记录直到我们完成要做的工作.注意:数据被直接作为一个字符串返回同时数据域名称用来指明读的数据域.while(dr.Read()){System.Console.WriteLine(dr["FirstName"]);}4.我们收工但是,作为好的程序员我们还需要加进许多try/catch/finally语句来确保我们处理了所有的错误.try{数据库操作...}catch(Exceptionex){System.Console.WriteLine("READING:");System.Console.WriteLine("ERROR:"ex.Message);System.Console.WriteLine("SQL:"sSqlCmd);System.Console.WriteLine("Conn.:"DB_CONN_STRING);}finally{//关闭连接if(conn.State==DBObjectState.Open)conn.Close();}读取不同的数据类型dr["stuff"]这个语句通常能够返回一个数据.但是要返回一个int或者DateTime对象的话通常需要进行数据转换.这通常可以通过使用ADODataReader许多内建转换器中的一个来实现.也就是:intnOrdinalAge=dr.GetOrdinal("Age");intnAge=dr.GetInt32(nOrdinalAge);DateTimetUpdated=(DateTime)dr["Updated"];注意GetOrdinal定位数据域用名字来读取数据的用法.如果数据域是空白的(还没有填入任何数据),上面的代码会抛出一个异常.要捕捉这种情况,我们可以用IsNull方法检查是否有数据存在,如下所示:intnOrdinalAge=dr.GetOrdinal("Age");if(dr.IsNull(nOrdinalAge)){System.Console.WriteLine("Age:Notgiven!");}else{intnAge=dr.GetInt32(nOrdinalAge);System.Console.WriteLine("Age:"nAge);}插入,修改,删除和其他SQL命令插入,修改,删除过程可以非常容易的通过SQL语句来实现.下面的代码执行一条SQL命令来插入一条记录.//SQL命令StringsSQLCommand="INSERTINTOPerson(Age,FirstName,Description,Updated)""VALUES(55,'Bob','IsaPenguin','2001/12/2520:30:15');";//创建command对象ADOCommandcmdAdder=newADOCommand(sSQLCommand,DB_CONN_STRING);cmdAdder.ActiveConnection.Open();//ExecutetheSQLcommandintnNoAdded=cmdAdder.ExecuteNonQuery();System.Console.WriteLine("\nRow(s)Added="nNoAdded"\n");注意:try/catch代码没有在上面的例子里出现,但是应该包括上面的代码.插入上面的代码通过建立一个SQL命令然后执行它来插入一条记录.一些在编写SQL命令时应注意的事项如下:1.数值数据应该直接表示.没有单引号(').2.字符串的表示应该包括在单引号中('blah').3.确保字符串中不包含任何嵌入的单(双)引号.这会使事情混淆.4.日期和时间数据用包裹在单引号中的国际通用形式来表示('YYYY/MM/DDHH:MM:SS').修改UPDATE命令指明要修改的数据和修改的动作.ExecuteNonQuery()的返回值指出改变的记录的个数,所以如果有5个Peter's在表单中的话下面的代码将返回5.StringsSQLCommand="UPDATEPersonSETAge=27WHEREFirstName='Peter'";删除DELETE命令指明要删除的记录.ExecuteNonQuery()的返回值指出改变的记录的个数,所以如果有2个Bobo在表单中的话下面的代码将返回2.两个Bobo都会被删除.StringsSQLCommand="DELETEFROMPersonWHEREFirstName='Bobo'"";Tags:dotnet技术,c#开发技术C#中一些字符串操作的常用用法Dot-Net技术|阅读(132)|评论(0)Oct282005[此文来源于互联网,牛C网只负责收集整理]//获得汉字的区位码byte[]array=newbyte[2];array=System.Text.Encoding.Default.GetBytes("啊");inti1=(short)(array[0]-''\0'');inti2=(short)(array[1]-''\0'');//unicode解码方式下的汉字码array=System.Text.Encoding.Unicode.GetBytes("啊");i1=(short)(array[0]-''\0'');i2=(short)(array[1]-''\0'');//unicode反解码为汉字stringstr="4a55";strings1=str.Substring(0,2);strings2=str.Substring(2,2);intt1=Convert.ToInt32(s1,16);intt2=Convert.ToInt32(s2,16);array[0]=(byte)t1;array[1]=(byte)t2;strings=System.Text.Encoding.Unicode.GetString(array);//default方式反解码为汉字array[0]=(byte)196;array[1]=(byte)207;s=System.Text.Encoding.Default.GetString(array);//取字符串长度s="iam方枪枪";intlen=s.Length;//willoutputas6byte[]sarr=System.Text.Encoding.Default.GetBytes(s);len=sarr.Length;//willoutputas33*2=9//字符串相加System.Text.StringBuildersb=newSystem.Text.StringBuilder("");sb.Append("i");sb.Append("am");sb.Append("方枪枪");/////////////////////////////////////////////////////////////////////string-->bytearraybyte[]data=Syste.Text.Encoding.ASCII.GetBytes(string);string-->bytebytedata=Convert.ToByte(string);byte[]-->stringstringstring=Encoding.ASCII.GetString(bytes,0,nBytesSize);Tags:dotnet技术,c#开发技术Asp.Net性能优化Dot-Net技术|阅读(112)|评论(0)Oct282005[此文来源于互联网,牛C网只负责收集整理](一).选择会话状态存储方式在Webconfig文件配置:<sessionStatemode="???"stateConnectionString="tcpip=:42424"sqlConnectionString="datasource=;Trusted_Connection=yes"cookieless="false"timeout="20"/>A有三种方式存储会话状态信息:1.存储在进程中:属性mode=InProc特点:具有最佳的性能,速度最快,但不能跨多台服务器存储共享.2.存储在状态服务器中:属性mode="StateServer"特点:当需要跨服务器维护用户会话信息时,使用此方法。但是信息存储在状态服务器上,一旦状态服务器出现故障,信息将丢失3.存储在SqlServer中:属性mode="SqlServer"特点:工作负载会变大,但信息不会丢失.补充一点:I.由于某些页面不需要会话状态,则可以将会话状态禁用:代码如下:<%@PageEnableSessionState="false"%>II.如果页面需要访问会话变量但不允许修改它们,可以设置页面会话状态为只读:代码如下:<%@PageEnableSessionState="false"%>使用时可以根据具体情况选择某种方式(二).使用Page.IsPostBackPage.IsPostBack表示是否是从客户端返回的.初次运行时,不是从客户端返回,它的值为false,当触发页面上的事件或刷新页面时,Page.IsPostBack由于是回发的,值变为true;一般在:Page_Load方法中用:privatevoidPage_Load(Objectsender,EventArgse){if(!Page.IsPostBack){;//初始化页面的代码。这些代码第一次页面初始化时执行,当第二次回发时,//不会再执行。提高效率。}}往往很多时候不得不用IsPostBack,因为有些控件初始化后,要保持它的状态.例如:DropDownList,如果每次都初始化,则用户无论选择其选项,都会被初始化为默认值.(三).避免使用服务器控件1.一般的静态显示信息,尽量不要用服务端控件显示.因为服务端控件需要回发服务端执行,会降低程序执行效率,一般用<DIV>显示即可.如果用了服务端控件,将:runat="server"去掉,也会提高效率.2.禁用服务端控件的状态视图,有些控件不需要维护其状态,可以设置其属性:EnableViewState=false;如果整个页面控件都不需要维持状态视图,则可以设置整个页面的状态视力为false:代码如下:<%@PageEnableViewState="false"%>3.在Web.Config文件中配置:ASP.NETSessionss可以在Web.config或Machine.config中的Sessionsstate元素中配置。下面是在Web.config中的设置的例子:<Sessionsstatetimeout="10"cookieless="false"mode="Inproc"/>(四).避免使用DataGrid大家都知道DataGrid功能强大。但是功能强大的同时,增加了性能上的开销。一般用其它控件:DataList或Repeater控件能实现的,尽量不用DataGrid.(五).字符串操作1.避免装箱操作.装箱操作运行效率比较低.例如运行两个代码段:stringtest="";for(forinti=0;i<10000;i){test=testi;}和stringtest="";for(forinti=0;i<10000;i){test=testi.ToString();}下面的代码段显然效率要高.因为i是整型的,系统要先把i进行装箱转换为string型的,再进行连接.需要时间,读者可以Copy到自己机器上测试一下.2.使用StringBulider类在进行字符串连接时:stringstr=str1str2;一般超过三项连接,最好用StringBuilder来代替String类.StringBuilder可以避免重新创建String对象造成的性能损失.一般用于组装Sql语句时用到:StringBulider.读者可以到自己机器上测试一下.(六).ADO.Net使用方面优化1.数据库连接打开和关闭。在需要连接时打开,当访问完数据库要立刻关闭连接.举例说明,还是看两个代码段:I.DataSetds=newDataSet();SqlConnectionMyConnection=newSqlConnection("server=localhost;uid=sa;pwd=;database=NorthWind");SqlCommandmyCommand=newSqlCommand(strSql,MyConnection);SqlDataAdaptermyAdapter=newSqlDataAdapter(queryStr,connectionStr);MyConnection.Open();//打开连接for(inti=0;i<1000;i)//for循环模拟取得数据前的商业逻辑操作{Thread.Sleep(1000);}myAdapter.Fill(ds);for(inti=0;i<1000;i)//for循环模拟取得数据后的商业逻辑操作{Thread.Sleep(1000);}MyConnection.Close();//关闭连接II.DataSetds=newDataSet();SqlConnectionMyConnection=newSqlConnection("server=localhost;uid=sa;pwd=;database=NorthWind");SqlCommandmyCommand=newSqlCommand(strSql,MyConnection);SqlDataAdaptermyAdapter=newSqlDataAdapter(queryStr,connectionStr);for(inti=0;i<1000;i)//for循环模拟取得数据前的商业逻辑操作{Thread.Sleep(1000);}MyConnection.Open();//打开连接myAdapter.Fill(ds);MyConnection.Close();//关闭连接for(inti=0;i<1000;i)////for循环模拟取得数据后的商业逻辑操作{Thread.Sleep(1000);}显示II代码比I代码好的多,I中早早占着连接不放,如果用户很多的话,容易出现连接池满情况。严重时出现死机现象.2.数据库查询I.直接生成SQL语句。SqlServer每次都要对其进行编译,在性能方面不会有很大的提高。另外也不够安全。容易被攻击.II.使用带
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 正规土方开槽合同协议
- 2025企业绿化工程合同苗木购销合同
- 2025个人消费贷款项目借款合同范本
- 2025超市物业委托管理合同【社区超市管理合同】
- 毕业生签约派遣合同协议
- 微型水空调采购合同协议
- 2025电子产品出口销售合同范本
- 微商城开发建设合同协议
- 商品陈列协议书范本
- 模型代工经营合同协议
- DB1303T375-2024起重机械使用管理制度编制指南
- 山西省云时代技术有限公司笔试题库
- (2025新版)建设工程安全防护、文明施工措施费用支付计划
- 言语治疗技术说评估CRRCAE法
- 2025年中考语文二轮复习名著思维导图专题课件《经典常谈》课件
- 钢结构隔层施工合同范本
- 季度工作总结报告模板
- 跟骨骨折护理查房课件
- 多模态交互反馈机制
- 部编版小学道德与法治三年级下册第8课《大家的“朋友”》课件
- 眩晕中医课件
评论
0/150
提交评论