ASP.NET网站制作之.NET泛型技能之范例参数之间的转换
因为二次编译器太复杂,那么建议只是在安装程序的时候编译一次,而不类似java那样运行就编译。并且我觉得,一次痛苦,总比多次低效率要舒服多了。技能|转换 起首我要先容的技能是怎样供应范例参数之间的转换。我们晓得,.NET泛型将每一个范例参数了解为一个自力的范例。假如欠亨过束缚指定,编译器不会对范例参数所代表的范例做任何假定。也就是说,假如在某个高低文中有两个分歧的范例参数U和V,编译器不会晓得运转时他们代表的实在范例可否举行范例转换,因而会回绝编译以下代码:PublicFunctionGenericCast(OfU,V)(ByValobjAsU)AsV
ReturnCType(obj,V)
EndFunction
除非我们加以束缚U是V的子类。这明显是为了范例平安做出的思索,由于.NET这类跨程序集的泛型没法在编译时做出充足的反省来确保范例平安。可是限定了这类操纵,就妨害了我们办事,良多代码因而写不出来。因而,我们能够使用.NET一切范例的基类Object来绕过这一限定:
ReturnDirectCast(DirectCast(obj,Object),V)
VB的DirectCast运算符在泛型的范例参数上感化与C#的括号运算符不异。也就是说,这段代码用C#写起来是如许:
return(V)(object)obj;
如许,即便不束缚U和V之间的干系,这段代码也能编译了。可是他的功效却不克不及令我们中意。如许写出的范例转换实践上仍是仅当U是V自己或其子类的时分才干转换乐成。而其他统统情形城市转换失利。不论U和V的运转时范例之间是不是界说有其他范例转换划定规矩。这明显分歧我们志愿,我们但愿int与double之间的转换等言语内置的范例转换都可以主动举行,不然就和束缚没甚么两样了。对VB用户来讲有一个极其复杂的办理计划――把第二次DirectCast酿成CType:
PublicFunctionGenericCast(OfU,V)(ByValobjAsU)AsV
ReturnCType(DirectCast(obj,Object),V)
EndFunction
如今,GenericCast泛型办法就可以实行int与double等外置划定规矩的转换了。很奇妙?由于CType运算符在编译时主动挪用了VB运转库的转换函数,该函数在运转时代对泛型范例参数的实在范例做了反省。并且这个历程的功能完整能够承受。
如今VB的用户已轻松享用这一功效了。可是C#的事变还没完,由于C#没有云云智能的范例转换运算符,因而就必要手工完成VB运转库所代庖的那些义务。实在就是使用了一下IConvertible:
staticVGenericCast<U,V>(Uobj)
{
IConvertibleconvertibleObj=objasIConvertible;
if(convertibleObj!=null)
{
Typet=typeof(V);
switch(Type.GetTypeCode(t))
{
caseTypeCode.Boolean:
return(V)(object)convertibleObj.ToBoolean(null);
caseTypeCode.Byte:
return(V)(object)convertibleObj.ToByte(null);
caseTypeCode.Char:
return(V)(object)convertibleObj.ToChar(null);
//.........
default:
//Noneofthem,usethefollowingdefaultway..
break;
}
}
return(V)(object)obj;
}
不外这个办法看起来不仅很丑、很贫苦,功效上还达不到VB版。以是倡议您用到这类范例参数之间的转换,就用VB封装这一功效,然后做成dll供C#挪用吧。
经由研讨发明Convert.ChangeType办法已封装了IConvertible判别的那些代码,因而C#版可接纳这类写法:
staticVGenericCast<U,V>(Uobj)
{
return(V)Convert.ChangeType(obj,typeof(V));
}
不外它仍旧没有VB版的CType功效丰厚。别的我还发明了VB运转库的ChangeType另有撑持用户自界说范例转换运算符的功效。以是最终版本以下:
PublicFunctionGenericCast(OfU,V)(ByValobjAsU)AsV
Try
ReturnCType(DirectCast(obj,Object),V)
CatchexAsInvalidCastExceptionReturnDirectCast(_
CompilerServices.Conversions.ChangeType(obj,GetType(V)),V)
EndTry
EndFunction
无论谁倒了对双方阵营的粉丝们也是有害无益。 ASP.Net摆脱了以前ASP使用脚本语言来编程的缺点,理论上可以使用任何编程语言包括C++,VB,JS等等,当然,最合适的编程语言还是MS为.NetFrmaework专门推出的C(读csharp)。 由于JSP/Servlet都是基于Java的,所以它们也有Java语言的最大优点——平台无关性,也就是所谓的“一次编写,随处运行(WORA–WriteOnce,RunAnywhere)”。除了这个优点,JSP/Servlet的效率以及安全性也是相当惊人的。 当然我们在选择Asp.net主机是,除了要考虑服务提供商在版本是否是实时更新以外,机房的环境和配置也是非常重要的,通常选择骨干网的机房,在速度和稳定性上会非常有保证。 当然我们在选择Asp.net主机是,除了要考虑服务提供商在版本是否是实时更新以外,机房的环境和配置也是非常重要的,通常选择骨干网的机房,在速度和稳定性上会非常有保证。 ASP.net的速度是ASP不能比拟的。ASP.net是编译语言,所以,当第一次加载的时候,它会把所有的程序进行编译(其中包括worker进程,还有对语法进行编译,形成一个程序集),当程序编译后,执行速度几乎为0。 如今主流的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。 代码的可重用性差:由于是面向结构的编程方式,并且混合html,所以可能页面原型修改一点,整个程序都需要修改,更别提代码重用了。
页:
[1]