飘灵儿 发表于 2015-1-16 22:33:44

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
无论谁倒了对双方阵营的粉丝们也是有害无益。

灵魂腐蚀 发表于 2015-1-19 16:29:10

ASP.Net摆脱了以前ASP使用脚本语言来编程的缺点,理论上可以使用任何编程语言包括C++,VB,JS等等,当然,最合适的编程语言还是MS为.NetFrmaework专门推出的C(读csharp)。

山那边是海 发表于 2015-1-28 08:42:43

由于JSP/Servlet都是基于Java的,所以它们也有Java语言的最大优点——平台无关性,也就是所谓的“一次编写,随处运行(WORA–WriteOnce,RunAnywhere)”。除了这个优点,JSP/Servlet的效率以及安全性也是相当惊人的。

兰色精灵 发表于 2015-2-5 20:15:41

当然我们在选择Asp.net主机是,除了要考虑服务提供商在版本是否是实时更新以外,机房的环境和配置也是非常重要的,通常选择骨干网的机房,在速度和稳定性上会非常有保证。

仓酷云 发表于 2015-2-13 11:51:48

当然我们在选择Asp.net主机是,除了要考虑服务提供商在版本是否是实时更新以外,机房的环境和配置也是非常重要的,通常选择骨干网的机房,在速度和稳定性上会非常有保证。

只想知道 发表于 2015-3-3 21:09:38

ASP.net的速度是ASP不能比拟的。ASP.net是编译语言,所以,当第一次加载的时候,它会把所有的程序进行编译(其中包括worker进程,还有对语法进行编译,形成一个程序集),当程序编译后,执行速度几乎为0。

admin 发表于 2015-3-11 13:46:36

如今主流的Web服务器软件主要由IIS或Apache组成。IIS支持ASP且只能运行在Windows平台下,Apache支持PHP,CGI,JSP且可运行于多种平台,虽然Apache是世界使用排名第一的Web服务器平台。

乐观 发表于 2015-3-18 21:23:21

ASP.net的服务器,要求安装一个.net环境,当然我这里指的是windows系统,顺便点一下,.net只能放在windows环境里来运行。Asp.net1.1的就装Framework1.1,Asp.net2.0的就装Framework2.0。

金色的骷髅 发表于 2015-3-26 18:53:16

代码的可重用性差:由于是面向结构的编程方式,并且混合html,所以可能页面原型修改一点,整个程序都需要修改,更别提代码重用了。
页: [1]
查看完整版本: ASP.NET网站制作之.NET泛型技能之范例参数之间的转换