[计算机软件及应用]c编程技巧.doc_第1页
[计算机软件及应用]c编程技巧.doc_第2页
[计算机软件及应用]c编程技巧.doc_第3页
[计算机软件及应用]c编程技巧.doc_第4页
[计算机软件及应用]c编程技巧.doc_第5页
已阅读5页,还剩90页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一、最小化窗口点击“X”或“Alt F4”时,最小化窗口,如:protected override void WndProc(ref Message m)const int WM_SYSCOMMAND = 0x0112;const int SC_CLOSE = 0xF060;if (m.Msg = WM_SYSCOMMAND & (int) m.WParam = SC_CLOSE)/ User clicked close buttonthis.WindowState = FormWindowState.Minimized;return;base.WndProc(ref m);二、如何让Foreach 循环运行的更快foreach是一个对集合中的元素进行简单的枚举及处理的现成语句,用法如下例所示:using System;using System.Collections;namespace LoopTestclass Class1static void Main(string args)/ create an ArrayList of stringsArrayList array = new ArrayList();array.Add(Marty);array.Add(Bill);array.Add(George);/ print the value of every itemforeach (string item in array)Console.WriteLine(item);你可以将foreach语句用在每个实现了Ienumerable接口的集合里。如果想了解更多foreach的用法,你可以查看.NET Framework SDK文档中的C# Language Specification。在编译的时候,C编辑器会对每一个foreach 区域进行转换。IEnumerator enumerator = array.GetEnumerator();try string item;while (enumerator.MoveNext() item = (string) enumerator.Current;Console.WriteLine(item);finally IDisposable d = enumerator as IDisposable;if (d != null) d.Dispose();这说明在后台,foreach的管理会给你的程序带来一些增加系统开销的额外代码。三、将图片保存到一个XML文件WinForm的资源文件中,将PictureBox的Image属性等非文字内容都转变成文本保存,这是通过序列化(Serialization)实现的,例子:/using System.Runtime.Serialization.Formatters.Soap;Stream stream = new FileStream(E:Image.xml,FileMode.Create,FileAccess.Write,FileShare.None);SoapFormatter f = new SoapFormatter();Image img = Image.FromFile(E:Image.bmp);f.Serialize(stream,img);stream.Close();四、屏蔽CTRL-V在WinForm中的TextBox控件没有办法屏蔽CTRL-V的剪贴板粘贴动作,如果需要一个输入框,但是不希望用户粘贴剪贴板的内容,可以改用RichTextBox控件,并且在KeyDown中屏蔽掉CTRL-V键,例子: private void richTextBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)if(e.Control & e.KeyCode=Keys.V)e.Handled = true;ps: 网上摘抄,看了以后感觉不错,以后碰见好的再陆续发布 Tags: dotnet技术 , c#开发技术 ASP.NET 2.0中使用webpart系列控件 Dot-Net技术 | 阅读(144) | 评论(0) Oct292005此文来源于互联网,牛C网只负责收集整理在现在的网站设计中,更强调的是用户的个性化设置,让用户可以自由的设置符合自己喜好的页面成为网站开发人员的头号难题,不过现在看来这个难题微软帮我们解决了。在 2.0中新增加了一系列webpart控件,可以让用户很方便地对网页的各区域布局进行调整。在一些web应用程序中,如果用户想自定义页面布局,比如一个新闻发布系统,想让左,中,右三栏的位置进行调换的话,就可以使用webpart控件。下面,我们来看下 2.0中webpart系列控件的一些基本用法。首先,在 2005 中的工具箱中,可以找到如下图所示的webpart系列控件,有很多个,限于篇幅,本文介绍其中的一些重要的控件: 在webpart系列控件中,其中的webpartmanager控件用于统一管理各webpart控件。而webpartzone控件,则是提供了各区域划分,在这些区域中,用户可以往里面放置各式各样的控件,而当运行的时候,用户可以移动的就是这些webpartzone控件所在的区域。为增强认识,我们先做个简单的例子。1、首先使用 2005 beta 2(或者RC1)新建一个web站点,2、往窗体中拖拉一个webpartmanager控件,再建一个3列1行的表格,分别往每个单元格里拖拉一个webpartzone控件,如下图: 3、往webpartzone1中拖拉放一个日历控件,并为这个日历控件选择一个合适的样式4、切换到代码视图状态,将日历控件的title属性改为:todays date。注意的是,日历控件本身没有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)Dim queryStr As String = HttpUtility.UrlEncode(txtSearch.Text)Response.Redirect(/search?q= & queryStr)End Sub4、这时,将写好的google.ascx控件,整个拖拉到我们刚才建立好的表格中的中间那个单元格,如下图所示: 我们并且修改代码如下,修改其名称为google serach:uc1:Google title=Google Search runat=server ID=Google1 /接下来,F5运行,可以看到,可以在googlesearch所在的webpart里进行google搜索了。同时,如果觉得webpart的那些关闭,恢复,最小化的按钮不大好看,还可以自定义按钮,比如在images目录下,添加下面的图片: 然后,在webpartzone1的属性中,指定如下的属性就可以了。CloseVerb.ImageUrl=Images/CloseVerb.gifEditVerb.ImageUrl=Images/EditVerb.gifMinimizeVerb.ImageUrl=Images/MinimizeVerb.gif RestoreVerb.ImageUrl=Images/RestoreVerb.gif 使webpart动起来上面设计的webpart还没能动起来,要让webpart动起来的话,必须要将webpar设置为design display 模式。先为webpart添加下面的radiobutton选择框asp:RadioButtonList ID=rblMode runat=server AutoPostBack=Trueasp:ListItemBrowse Display Mode/asp:ListItemasp:ListItemDesign Display Mode/asp:ListItem/asp:RadioButtonList并且在code-behind的代码中,写入如下代码:Protected Sub RadioButtonList1_SelectedIndexChanged(ByVal sender As Object, _ ByVal e As System.EventArgs) _ Handles rblMode.SelectedIndexChangedSelect Case rblMode.SelectedIndexCase 0 : WebPartManager1.DisplayMode =WebPartManager.BrowseDisplayModeCase 1 : WebPartManager1.DisplayMode = WebPartManager.DesignDisplayModeEnd SelectEnd Sub运行上面代码,选择design display mode,则可以象下图那样,自由拖动webpart,要注意的是,当移动各webpart的位置后,即使关掉浏览器,下次重新打开时,依然可以看到各个控件保持原来的位置。其实, 2.0是使用在aspnetdb.mdf中的一个叫aspnet_PersonalizationPerUser的表来保存数据的,表的结构如下所示:Field Value Id 928e121a-4042-4fb4-9520-21210b9b37c1 PathId 7c3b5dc0-04d0-48a2-bbb2-2b70286f22fe UserId 9bff14df-024f-4bda-9a0a-b4a19ab9e387 PageSettings Binary data LastUpdatedDate 10/06/2005 4:44:05 AM 如果想恢复各控件的原来位置,只需要将该数据表中相应的行删除掉就可以了。但有个问题是,如果使用每一个webpart的关闭按钮,则很难再将其恢复(当然删除数据表中的行,但十分麻烦)。在 2.0中,提供了另一种webpart,叫做catlogzone控件,下面介绍其用法:1、往窗体中拖拉一个catlogzone控件,如下图所视。2、往该catlogzone控件区域中,再拖放三个webpart系列的控件,分别是DeclarativeCatalogPart, PageCatalogPart, and ImportCatalogPart,如下图所示。其中,DeclarativeCatalogPart控件的作用是,显示目前页面上有哪些可以用的webpart控件;PageCatalogPart的作用是,可以让用户通过勾选的方式,选定将哪些控件添加转移到其他webpart区域中去。ImportCatalogPart则可以通过外部磁盘文件的方式,加载其他做好了的webpart部件。3、在radiobutton区域中,修改以下代码,增添一个catalog display的显示模式:asp:RadioButtonList ID=rblMode runat=server AutoPostBack=Trueasp:ListItemBrowse Display Mode/asp:ListItemasp:ListItemDesign Display Mode/asp:ListItemasp:ListItemCatalog Display Mode/asp:ListItem/asp:RadioButtonList然后,在code-behind的代码中,将代码修改为如下:Protected Sub rblMode_SelectedIndexChanged( _ByVal sender As Object, _ByVal e As System.EventArgs) _Handles rblMode.SelectedIndexChangedSelect Case rblMode.SelectedIndexCase 0 : WebPartManager1.DisplayMode = WebPartManager.BrowseDisplayModeCase 1 : WebPartManager1.DisplayMode = WebPartManager.DesignDisplayModeCase 2 : WebPartManager1.DisplayMode = WebPartManager.CatalogDisplayModeEnd SelectEnd Sub4、在DeclarativeCatalogPart任务菜单上,点击右上角的智能感知按钮,然后选edit templates的链接,进入模版编辑状态,如下图:再往其中的webpartstemplate区域中拖拉一个google.ascx控件,如下图,这将允许用户在运行时,可以自由地往页面增加这样的google搜索控件。5、然后修改代码如下:ZoneTemplateasp:DeclarativeCatalogPart ID=DeclarativeCatalogPart1 runat=serverWebPartsTemplateuc1:Google title=Google Search ID=Google2 runat=server /WebPartsTemplate/asp:DeclarativeCatalogPart6、运行程序,可以看到,当选择catalog display mode时,会显示如下图所示的catalog zone,其中列出了当前可用的有哪些webpart控件,我们可以把这个google的控件加到其他的webpart区域,也可以尝试将已经存在的webpart控件关闭,然后在catalog zone区域中的控件列表中,把它们再加回到页面中去。此外,在运行期间,还可以动态地修改webpart控件的外观等属性,如下:1) 往窗体中添加一个editor zone的区域控件,往其中再拖放一个appearanceEdiotrPart控件,该控件可以在运行时,让用户动态改变各webpart控件的属性。2) 我们再修改radiobutton选择框的代码如下,则加一个编辑模式:asp:RadioButtonList ID=rblMode runat=server AutoPostBack=Trueasp:ListItemBrowse Display Mode/asp:ListItemasp:ListItemDesign Display Mode/asp:ListItemasp:ListItemCatalog Display Mode/asp:ListItemasp:ListItemEdit Display Mode/asp:ListItem/asp:RadioButtonList3) 修改code-behind代码如下:Protected Sub rblMode_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) _Handles rblMode.SelectedIndexChangedSelect Case rblMode.SelectedIndexCase 0 : WebPartManager1.DisplayMode = WebPartManager.BrowseDisplayModeCase 1 : WebPartManager1.DisplayMode = WebPartManager.DesignDisplayModeCase 2 : WebPartManager1.DisplayMode = WebPartManager.CatalogDisplayModeCase 3 : WebPartManager1.DisplayMode = WebPartManager.EditDisplayModeEnd SelectEnd Sub4) 运行程序,选择edit display mode模式,这时,会发现每个控件的右上角,会多了一个edit的按钮,点该按钮,弹出如下图的窗体,用户可以修改每个控件的外观等属性。最后,我们看下,webpart控件之间还可以进行相互之间的通信,下面的例子中,要实现的是,在一个日历控件中点选某一个日期,会在已经做好的googlesearch的webpart控件的文本框中显示其日期,达到通信的目的,下面介绍其实现步骤:1、为了使两个webpart控件之间进行通信,必须先声明一个公共的接口。往工程项目里增加一个叫ISelectedDate.vb的类文件,放在app_code目录下,写入如下代码:Imports Microsoft.VisualBasicPublic Interface ISelectedDateReadOnly Property SelectedDate( ) As DateEnd Interface这里,我们返回一个只读的日期属性selectedDate.2、再创建一个日历控件CalendarUC.ascx,其中拖拉一个普通的日历控件即可。然后写入如下代码:Partial Class CalendarUC_ascxInherits System.Web.UI.UserControlImplements ISelectedDatePublic ReadOnly Property SelectedDate( ) As Date Implements ISelectedDate.SelectedDateGetReturn Calendar1.SelectedDate.DateEnd GetEnd PropertyConnectionProvider(SelectedDate, SelectedDate) _Public Function GetSelectedDate( ) As ISelectedDateReturn MeEnd FunctionEnd Class上面的代码,首先实现了已经声明了的IselectedDate接口,要留意的是ConnectionProvider(SelectedDate, SelectedDate)中的写法。由于在这个例子中,日历控件要为其他的控件提供信息,因此,该日历控件是一个provider(提供者),而另外的接收信息的控件,是consumer(消费者)。而两者为了要通信,必须要提供一个通信接入点,就象一个电插头,要找到合适的电插板一样。因此,ConnectionProvider(SelectedDate, SelectedDate)中的第一个参数,定义了两者的接口点,第二个参数,则是要传递给consumer的参数,本例是selectedDate。3、接下来,我们在已经做好的google.ascx控件的代码中,编写如下代码:Private _selectedDate As ISelectedDateConnectionConsumer(SelectedDate, SelectedDate) _Sub setSearchText(ByVal SearchText As ISelectedDate)Me._selectedDate = SearchTextEnd SubProtected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRenderIf _selectedDate IsNot Nothing ThentxtSearch.Text = _selectedDate.SelectedDate.ToShortDateStringEnd IfEnd Sub可以看到 ConnectionConsumer(SelectedDate, SelectedDate)的定义必须和provider中的定义一样。4、再修改如下代码,将两个控件的命名变得通俗易懂ZoneTemplateuc1:Google title=Google Search runat=server ID=Google1 /uc3:CalendarUC title=Calendar Web Part runat=server ID=CalendarUC1 /ZoneTemplate5、最后,为了使两者能互相通信,必须在default.aspx页中修改如下代码:asp:WebPartManager ID=WebPartManager1 runat=serverStaticConnectionsasp:WebPartConnection ID=Connection ProviderID=CalendarUC1ProviderConnectionPointID=SelectedDate ConsumerID=Google1 ConsumerConnectionPointID=SelectedDate /StaticConnections/asp:WebPartManager6、在页面代码中,增加一个radiobutton,用作显示connection模式,并写入如下代码:Case 4 : WebPartManager1.DisplayMode = WebPartManager.ConnectDisplayMode7、运行程序,选择connect displaymode模式。再选择GOOGLE SEARCH的那个webpart控件,点右上角的conenct按钮,此时,会显示如下图所示,提示你要选择从那个控件中得到信息,这里选择日历控件,按确定。那么,当点选日历控件的某个日期值的时候,GOOGLE SEARCH的那个文本框里,就会显示相应的日期了。小结:本文主要介绍了在 2.0中,如何使用基本的webpart系列控件,以达到改变页面布局以及如何使页面的各webpart控件相互之间通信。 Tags: dotnet技术 , c#开发技术 用C#与XML创建动态分层菜单 Dot-Net技术 | 阅读(164) | 评论(0) Oct282005此文来源于互联网,牛C网只负责收集整理Author:unknown From: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名称空间创建的。.Net SDK 是这样定义集合的:一个集合就是一个类型和资源的汇集信息,这些类和资源一起使用,形成一个功能的逻辑单元,即一个“逻辑”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文件,这些文件联合在一起生成了本文开始部分的图示结果。 我们在List 1的代码显示了用来标记单独菜单项目的XML文档的一部分。文档中的主元素命名为menuItem,它可以包含一个名字和超级链接元素以及额外的menuItem 子元素。这种关系可以用来创建包含子菜单的菜单系统,就象Windows的开始菜单一样。 由于 XML已经标出了分层关系,因此就可以利用循环在不同元素之间行走:当使用XmlDocument、XmlNode和XmlNodeList类创建子节点时,我们可以反复调用WalkTree() 函数以颠倒父/子关系。其它的类如 ArrayList和 StreamWriter用于将相关菜单归类到数组中,然后在适当时间将所生成的菜单结构写入一个文件中。 XmlMenus集合的代码开始时要声明一个XmlHierMenu 名称空间,接下来要引用 System、 System.Xml、 System.Collections和System.IO 名称空间: using System; using System.Xml; using System.Collections; using System.IO; 在这部分代码之后要创建3个构造器。一个构造器不接收变量,只对变量进行初始化。下一个构造器接收一个图象文件的定制路径。最后一个构造器在不经常对XML菜单进行刷新的情况下,允许将由集合生成的输出存储到一个文件中。最后一个构造器所生成的文件可以被静态地包含在一个 ASP.NET文件中,而不是在各个Web页面请求时随时地生成。 在构造器之后,开始定义 CreateMenu()方法,具体请看List 2中的代码。 这个方法负责进行XML文档的装载和解析,找到根节点,然后在根的子节点之间循环。如果发现一个子节点本身还有子节点,就调用WalkTree() 方法,并且把这些子节点都传递到其中。如果这些子节点还有子节点,就再次调用 WalkTree()。这个过程循环进行直到不再发现增加的子节点。Walktree()方法的代码可以参看List 3。 在调用 WalkTree()方法并且对不同的节点进行分析的同时,要解析 menuItem节点,将来自其超级链接和名字节点的数据放在数组列表中。对整个 XML文档都进行解析之后,数组列表的内容就被传递回调用的ASP.NET的页面,然后使用Response对象写出信息。从这时起,客户端的 JavaScript代码就开始控制DHTML 菜单了。 在服务器端,我们使用一个 ASP.NET页面来开始菜单的创建过程。这个页面输入了与集合相关联的名称空间XmlHierMenu: 然后,将样式表文件和 JavaScript文件包含在文件的 代码区中。最后,在 ASP.NET 页面底部的代码用来引用上面提到的CreateMenu() 方法与WalkTree()方法,请看List 4。 在ASP.NET 页面中所找到的C# 代码只是建立了到不同的XML文档的路径,并且对 XmlMenu 类进行了例示。一旦对这个类进行了例示,就对 CreateMenu()方法进行调用。这个方法接收菜单名以及到这个菜单的XML文档的文件路径。在本例中,要创建3个名为menu1、 menu2和 menu3 的菜单,然后在一个ASP.NET页面中使用。这个应用程序在一个给定页面中可以支持无穷多的菜单,但是我们建议菜单数目不要过多,因为每增加一个菜单,发送到客户端的文件规模都会增加。 编译 C# 文件 现在我们已经看到了菜单应用程序的结构,接下来讨论一下使用哪些开关可以将C# 文件编译到一个集合中。在 .Net SDK 文档中,我们可以查询到一个所有编译开关的完整列表。 要想正确地编译 C# 文件以使它能用于一个ASP.NET 页面中,编译器就必须要知道包含了System.Xml 集合。这可以通过使用 /r 开关并在后面加上到集合的完整路径来完成。由于将要创建的 dll是一个库,因此就必须指定 /t开关,这样编译器就不再寻找一个静态的 Main() 方法。最后一个需要的开关是 /out ,它将告诉编译器输出的文件名是什么,以及将其放在哪里。 所有对 C# 编译器的调用都以 csc (C# 编译器)开始,然后指定适当的开关。编译器语法的最后一部分包括到已创建的 .cs 文件的路径。请看下面的编译文件的完整语法格式: C:csc /r:System.Xml.dll / t:library /out:d:inetpubwwwroot xmlbinxmlMenus.dll d:inetpub wwwrootxmlmenusxmlMenus.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关键字重温这种美妙的感觉。值传递每当调用一个函数的时候,我们就必须为该函数的每一个形参传递一个实参。默认情况下,采用值传递的机制。也就是说,实参的值会被拷贝到形参里面,这样我们在函数内部得到一个本地变量,该变量的值和传递进来的那个实参的值相等,但是它们存放在不同的存储空间。因此,我们对函数参数所做的一切实际上都是对函数提内本地变量的操作,绝对不会影响到作为实际参数传递过来的那个函数体外的变量。看下面的例子,我就不再多费口舌了。using System;namespace CS语言函数参数的传递 / / Class1 的摘要说明。 / class Example static void Main(string args) int argument = 5; Example exp = new Example(); System.Console.WriteLine(argument); exp.fun1(argument); System.Console.WriteLine(argument); public Example() public void fun1(int parameter) /对parameter的操作实际上是对本地变量的修改 /不会影响到函数体外作为实参传递过来的变量 parameter = 5; System.Console.WriteLine(parameter); 但是值传递的机制有一个明显的缺点。主要表现在值类型的传递方面。我们对参数的修改会在函数体执行结束之际消失。如果我们希望将这种变化影响到作为实参传递过来的那个函数体以外的变量就必须把值类型作为引用类型传递。后边会具体讨论。值传递机制的另一个缺点,或许你会认为这是一个优点,表现在引用类型的传递方面。按照值传递的机制传递一个引用类型的变量,实际上只是完成了一次浅拷贝。请不要误认为对整个对象进行了深拷贝。函数参数得到的只是实参的handle的值。也就是说,本地的参数实际上只是一个引用类型的handle,和作为实参传递过来的那个变量的handle具有相同的值,指向同一个object(两个handle指向堆上的相同位置)。这样我们在函数内部对参数所做的修改会直接影响到堆上的object。当函数结束之后,本地的参数消失,而对于堆上的object的修改会成为持久的修改而继续保留下来。把值类型作为引用类型传递有一些时候,我们不惜望函数对于参数的修改随着函数的结束而消失。作为引用类型,作到这一点其实一点都不难,就像我们上面说的那样。但是,如果是值类型的参数,似乎就有一点麻烦了。从前在C/C 里面可以采取传递指针的方法来达到这个目的。但是CLR已经明确取消了指针。作为补偿,C#为我们提供了ref关键字。ref关键字通知编译器,参数的实参是作为引用类型而非值类型进行传递。下面的这段程序帮助我们说明问题。using System;namespace CS语言函数参数的传递 class Example static void Main(string args) int argument = 5; Example exp = new

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论