ASP.NET编程:[你必需晓得的.NET]第十一回:参数之惑――传送的艺术(上)仓酷云 ...
兄弟们,想来你们都看过了昨天的比赛了。我现在的痛苦状跟当时应该差不多。希望本版.net老师不吝赐教,为小弟这一批迷途的羊羔指一条阳光之道!您也知道:学习技术如果只有一个人摸索,那是一件多么痛苦的事情!还有,如果万辛能得名师或长者指点,那又是多么一件幸福和快乐的事情!系列文章目次索引:《你必需晓得的.NET》本文将先容以下内容:
[*]按值传送与按援用传送深论
[*]ref和out对照
[*]参数使用浅析
<br>
1.弁言
接上回《第九回:咀嚼范例---值范例与援用范例(中)-划定规矩无边》中,对值范例和援用范例的会商,个中关于string范例的参数传送示例息争释,引发园友的存眷和会商,可谓一石激起千层浪。受教于拆卸脑壳的深切斧正,对这一观点有了相称进一步的懂得,现实证实是我错了,在此向伴侣们道歉,同时十分感激人人的介入,特别是拆卸脑壳的不倦相告。
因而,本文就以更加明晰的角度,把我了解有误的雷区作做以深切的会商与剖析,但愿经由过程我的一点点勉力和切磋最少对以下几个成绩能有明晰的观点:
[*]甚么是按值传送?甚么是按援用传送?
[*]按援用传送和按援用范例参数传送的区分?
[*]ref与out在按援用传送中的对照与使用怎样?
[*]param润色符在参数传送中的感化是甚么?
2.参数基本论
复杂的来讲,参数完成了分歧办法间的数据传送,也就是信息互换。ThinkinginJava的作者有过一句名言:统统皆为对象。在.NET言语中也是云云,统统数据都终极笼统于类中封装,因而参数一样平常用于办法间的数据传送。比方典范的Main出口函数就有一个string数组参数,args是函数命令行参数。一般参数依照挪用体例能够分为:形参和实参。形参就是被挪用办法的参数,而实参就是挪用办法的参数。比方:
usingSystem;
publicclassArguments
{
publicstaticvoidMain(string[]args)
{
stringmyString="Thisisyourargument.";
//myString是实践参数
ShowString(myString);
}
privatevoidShowString(stringastr)
{
Console.WriteLine(astr);
}
}
由上例能够得出以下几个关于参数的基础语法:
[*]形参和实参必需范例、个数与按次对应婚配;
[*]参数能够为空;
[*]剖析Main(string[]args),Main函数的参数能够为空,也能够为string数组类,其感化是承受命令行参数,比方在命令行下运转程序时,args供应了输出命令行参数的出口。
[*]别的,值得一提的是,固然CLR撑持参数默许值,可是C#中却不克不及设置参数默许值,这一点让我很忧郁,不知为什么?不外能够经由过程重载来变相完成,详细以下:
staticvoidJudgeKind(stringname,stringkind)
{
Console.WriteLine("{0}isa{1}",name,kind);
}
staticvoidJudgeKind(stringname)
{
//伪代码
if(nameisperson)
{
Console.WriteLine(name,"People");
}
}这类办法能够扩大,能够完成更多个默许参数完成,不外,说假话有些画蛇添足,不敷天真,不爽不爽。
3.传送的基本
接上去,我们接下面的示例会商,重点将参数传送的基本做以交卸,以便对参数之惑有一个从简进繁的演变历程。我们以基础观点的情势来逐一列出这些基础观点,先混个脸儿熟,关于形参、实参、参数默许值的观点就未几做交卸,参数传送是本文的中心内容,将在后文以大批的文字来论述。以是接上去的观点,我们就做以复杂的引进不花大批的精神来会商,次要包含:
3.1泛型范例参数
泛型范例参数,能够是静态的,比方MyGeneric<int>;也能够是静态的,此时它实在就是一个占位符,比方MyGeneric<T>中的T能够是任何范例的变量,在运转期静态交换为响应的范例参数。泛型范例参数一样平常也以T开首来定名。
3.2可变数量参数
一样平常来讲参数个数都是流动的,界说为集群范例的参数能够完成可变数量参数的目标,可是.NET供应了更天真的机制来完成可变数量参数,这就是利用param润色符。可变数量参数的优点就是在某些情形下能够便利的供应关于参数个数不断定情形的完成,比方盘算恣意数字的加权和,毗连恣意字符串为一个字符串等。我们以一个复杂的示例来睁开对这个成绩的叙述,为:
<br>
在此基本上,我们将利用param关头字完成可变数量参数的划定规矩和利用做以小结为:
[*]param关头字的本色是:param是定制特征ParamArrayAttribute的缩写(关于定制特征的具体叙述请拜见第三回:汗青纠葛:特征和属性),该特征用于唆使编译器的实行历程也许能够简化为:编译器反省到办法挪用时,起首挪用不包括ParamArrayAttribute特征的办法,假如存在这类办法就实施挪用,假如不存在才挪用包括ParamArrayAttribute特征的办法,同时使用办法中的元从来添补一个数组,同时将该数组作为参数传进挪用的办法体。总之就是param就是提醒编译器完成对参数举行数组封装,将可变数量的把持由编译器来完成,我们能够很便利的从上述示例中失掉启发。比方:
staticvoidShowAgeSum(stringteam,paramsint[]ages){...}
本色上是如许子:
staticvoidShowAgeSum(stringteam,int[]ages){...}
[*]param润色的参数必需为一维数组,现实上一般就是以聚集体例来完成多个大概恣意多个参数的把持的,以是数组是最复杂的选择;
[*]param润色的参数数组,但是是任何范例。因而,假如必要承受任何范例的参数时,只需设置数组范例为object便可;
[*]param必需在参数列表的最初一个,而且只能利用一次。
4.深切会商,传送的艺术
默许情形下,CRL中的办法都是按值传送的,可是在详细情形会依据传送的参数情形的分歧而有分歧的体现,我们在深切会商传送艺术的请求下,就是将分歧的传送情形和分歧的体现情形做以小结,从中剥离出参数传送庞大体现以内的本色地点。从而为开篇的几个成绩给出明晰的谜底。
4.1值范例参数的按值传送
起首,参数传送依据参数范例分为按值传送和按援用传送,默许情形下都是按值传送的。按值传送次要包含值范例参数的按值传送和援用范例参数的按值传送。值范例实例传送的是该值范例实例的一个拷贝,因而被挪用办法操纵的是属于本人自己的实例拷贝,因而不影响本来挪用办法中的实例值。以例为证:
//FileName:Anytao.net.My_Must_net
//Description:The.NETwhatyoushouldknowofarguments.
//Release:2007/07/011.0
//Copyright:(C)2007Anytao.comhttp://www.anytao.com
usingSystem;
namespaceAnytao.net.My_Must_net
{
classArgs
{
publicstaticvoidMain()
{
inta=10;
Add(a);
Console.WriteLine(a);
}
privatestaticvoidAdd(inti)
{
i=i+10;
Console.WriteLine(i);
}
}
}
歇息一下,请看下篇『第十二回:参数之惑---传送的艺术(下)』
<br>
参考文献
(USA)JeffreyRichter,AppliedMicrosoft.NETFrameworkProgramming
(USA)DavidChappell,Understanding.NET
那么,ASP.Net有哪些改进呢? 提供基于组件、事件驱动的可编程网络表单,大大简化了编程。还可以用ASP.NET建立网络服务。 PHP的源代码完全公开,在OpenSource意识抬头的今天,它更是这方面的中流砥柱。不断地有新的函数库加入,以及不停地更新,使得PHP无论在UNIX或是Win32的平台上都可以有更多新的功能。它提供丰富的函数,使得在程式设计方面有着更好的资源。目前PHP的最新版本为4.1.1,它可以在Win32以及UNIX/Linux等几乎所有的平台上良好工作。PHP在4.0版后使用了全新的Zend引擎,其在最佳化之后的效率,比较传统CGI或者ASP等技术有了更好的表现。 代码逻辑混乱,难于管理:由于ASP是脚本语言混合html编程,所以你很难看清代码的逻辑关系,并且随着程序的复杂性增加,使得代码的管理十分困难,甚至超出一个程序员所能达到的管理能力,从而造成出错或这样那样的问题。 如今主流的Web服务器软件主要由IIS或Apache组成。IIS支持ASP且只能运行在Windows平台下,Apache支持PHP,CGI,JSP且可运行于多种平台,虽然Apache是世界使用排名第一的Web服务器平台。 ASP.net的服务器,要求安装一个.net环境,当然我这里指的是windows系统,顺便点一下,.net只能放在windows环境里来运行。Asp.net1.1的就装Framework1.1,Asp.net2.0的就装Framework2.0。 业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高,你可以通过继承已有的对象最大限度保护你以前的投资。并且C#和C++、Java一样提供了完善的调试/纠错体系。 PHP的源代码完全公开,在OpenSource意识抬头的今天,它更是这方面的中流砥柱。不断地有新的函数库加入,以及不停地更新,使得PHP无论在UNIX或是Win32的平台上都可以有更多新的功能。它提供丰富的函数,使得在程式设计方面有着更好的资源。目前PHP的最新版本为4.1.1,它可以在Win32以及UNIX/Linux等几乎所有的平台上良好工作。PHP在4.0版后使用了全新的Zend引擎,其在最佳化之后的效率,比较传统CGI或者ASP等技术有了更好的表现。 可以看作是VC和Java的混合体吧,尽管MS自己讲C#内核中更多的象VC,但实际上我还是认为它和Java更象一些吧。首先它是面向对象的编程语言,而不是一种脚本,所以它具有面向对象编程语言的一切特性。 Asp.net脚本的出现,为ASP空间带来了更高的稳定性,同时也为程序员建站提供更高环境! Asp.net脚本的出现,为ASP空间带来了更高的稳定性,同时也为程序员建站提供更高环境! Asp.net脚本的出现,为ASP空间带来了更高的稳定性,同时也为程序员建站提供更高环境! 如今主流的Web服务器软件主要由IIS或Apache组成。IIS支持ASP且只能运行在Windows平台下,Apache支持PHP,CGI,JSP且可运行于多种平台,虽然Apache是世界使用排名第一的Web服务器平台。
页:
[1]