仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1156|回复: 9
打印 上一主题 下一主题

[学习教程] ASP.NET网页设计怎样利用 Lambda 表达式做笼统代表

[复制链接]
山那边是海 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:24:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
另外,小型软件代码重用价值低,没有必要跨平台;大型软件,有严格的规划、部署,不可以随意跨平台。Lambda表达比代表界说和带外办法界说的分离更分明,且相干的分外事情只必要满意言语界说便可。不外,它也有一些不敷的地方。假如某个办法的参数包括System.Delegate如许的笼统范例,用lambda表达式先容特别的成绩:C#编译器不克不及将lambda表达式转换成还未明白界说的衍生代表范例。假如不细心思索一下,你的代码看上往就会像是来自.NET1.0的器材。在本文中,我将告知告知你为何lambda表达式不敷以被间接转换成笼统代表范例,而且教你如何使得编译器转换你所界说的指定代表。办理计划依附于WindowsPresentationFoundation(WPF)和System.Windows.Threading.Dispatcher组件,可是严厉意义上说,该成绩不是一个WPF成绩。文中所形貌的成绩呈现在多少.NET框架中,包含WindowsForms,Office使用程序接口和映照使用程序接口。你能够依照以下办法来处置同类成绩。
不管我甚么时分利用.NET框架中带有来自代表表格的参数的使用程序接口,我城市偏向于利用lambda表达式而不是更具体的表达式。比方,这行代码创立了一个System.Windows.Threading.Timer,在计时器生效时,该代码挪用了一个TickHandler办法:
tick=newSystem.Threading.Timer((unused)=>
TickHandler());
假如办法的内容充足少,我就会用办法的内容替换TickHandler()办法挪用。该办法年夜多半情形下都无效,可是当使用程序接口将System.Delegate作为参数时,这一技能不论用。比方,我们将System.Windows.Controls.Dispatcher.Invoke()办法穿过WPF中的线程实行挪用:
publicobjectInvoke(
delegatemethod,
paramsobject[]args)
如今思索一下当我们实验用lambda表达式来实行如许的挪用时,将会产生甚么:
MyTime.Dispatcher.Invoke(()=>DoSomething());
会呈现秘密毛病:
errorCS1660:Cannotconvertlambdaexpressionto
typeSystem.Delegatebecauseitisnotadelegatetype
也许第一次看到这个毛病的时分,你还不晓得究竟是怎样一回事。固然,这切实其实是一个代表范例。编译器不像人一样的天真。System.Delegate范例是一个笼统范例,且该范例的推理工具不克不及揣度出自变量或某些用于未知代表范例的前往值的数目和品种。要办理这一成绩,我们必需创立一个详细的代表范例并为该范例指定lambda表达式。记着,代表范例请求你将办法视为数据。
我创立了一个WPF计时器程序来展现其事情道理,个中论述了C#3.0如何简化与老式使用程序接口(下图)的运转。
当你做演示的时分,该示例中的使用程序运转了一个计时器,跟着设准时间流逝,它的色彩会从绿色转为黄色再转为白色。这是一个很好的演示跨线程挪用的办法,由于该计时器在背景线程中运转。
依照工夫的改动来更新演示请求对出自计时器的事务作出呼应。计时器在背景线程中运转,以是你会很容易地犯我们在后面提到过的毛病。
更新使用程序
用户界面处置的是复杂代码。当计时器生效时它会失效,并且代码会更新计时器的显现。这一更新必需改动文本,或把持背景。以下所示:
MyTime.Background=newBrush;
MyTime.Content=label
计时器在背景线程上运转,以是你必要经由过程利用Dispatcher.Invoke()界限线实行挪用。这两行代码是你想列进lambda表达式的代码,不是证实办法界说的逻辑来由。可是我之前就讲过lambda不会与Didpatcher.Invoke一同运转,除非是你利用了详细的代表界说才行。这当中的一部分已在.NET框架3.5中界说了。
我们可使用嵌进式代表界说并对它们举行分派,这些都是的该办理计划比起先条件到过的案例都要费事一些。这两行代码也请求一对参数:一个用于文本的字符串和用于背景色彩的色彩刷。这意味着你必要利用的代表界说要思索到这两个参数并前往有效值:
ActionupdateTimer;
在声明变量后,你能够为代码指定必要实行的代表变量。这里你可使用lambda表达式,由于Action是一个详细的代表界说:
updateTimer=(label,newBrush)=>
{
MyTime.Background=newBrush;
MyTime.Content=label;
};
如今,当计时器提失事件时,你已具有了一些必要实行的指向该代码的变量。接上去要做的就只是经由过程Dispatcher.Invoke()利用代表界说:

if(!MyTime.Dispatcher.CheckAccess())
{
MyTime.Dispatcher.Invoke(updateTimer,
newLabel,next);
}
else
updateTimer(newLabel,next);
这一历程非常复杂,可是却请求你重复举行,因而,我们可让步骤变得简单一点。
这里实在由一个复杂的形式。事务处置器能够从背景线程中挪用出来。当我们利用计时器,大概异步伐用Web服务和其他相似义务的时分,你就会看到这一举动。不管是在甚么时分,我们都不分明本人位于哪一个线程之上,我们能够挪用Dispatcher.CheckAccess()来决意是不是能够会见恣意用户界面控件。假如必要从线程界限实行挪用,就必需利用Dispatcher.Invoke()。Dispatcher.Invoke()办法制止了因为利用了办法参数的参数数组而酿成的多少超载成绩。它利用的是一个我们想要实行的笼统代表范例。
你想要一个能反省是不是必要收拾编排的单一办法。假如必要,则办法会编排好挪用,不然,会挪用由代表指定的办法。你卖弄办法作为System.Windows.Controls.Control范例的成员呈现。如许使得你能够将代码作为控件的一部分来利用。C#3.0就为你供应了如许做的办法:扩大办法。你必要编写一些办法的分歧超载,这些使得你能够经由过程分歧的参数来利用它们:
publicstaticclassWPFExtensions:
{
publicstaticvoidInvokeIfNeeded(
thisControlwidget,
ActionwhatToDo)
{
if(!widget.Dispatcher.
CheckAccess())
widget.Dispatcher.Invoke(whatToDo);
else
whatToDo();
}
publicstaticvoid
InvokeIfNeeded(
thisControlwidget,Action
whatToDo,Tparm)
{
if(!widget.Dispatcher.CheckAccess())
widget.Dispatcher.Invoke(whatToDo,parm);
else
whatToDo(parm);
}
publicstaticvoid
InvokeIfNeeded(this
Controlwidget,Action
whatToDo,
T1parm1,T2parm2)
{
if(!widget.Dispatcher.
CheckAccess())
widget.Dispatcher.
Invoke(whatToDo,
parm1,parm2);
else
whatToDo(parm1,parm2);
}
}
固然,我们也能够经由过程增加更多参数的体例来增加更多超载以扩大这个类。这实际上是一个复杂的扩大。
有一种办法让WPF计划师们猖狂:他们但愿用最小化使用程序接口的面积部分来简化Dispatcher工具的利用。经由过程利用笼统代表和参数列表中的参数,这一工具的利用局限被扩展了。
任何带有参数的办法都能够被拿来利用。可是,如许做有一个不敷的地方。该使用程序接口更加笼统,它会损坏一切范例的平安性,并且如许做会破坏编译器利用范例推理的才能,从而下降事情效力。必要做的应当是增加本人的平安扩大办法的层范例,这一层范例能够在范例平安挪用和更加笼统的.NET库使用程序接口之间供应一个层。
c语言的编译器,几乎是所有新平台都有的。因此从这点上看,c语言的程序,比其他任何语言更加容易跨平台。
小妖女 该用户已被删除
沙发
发表于 2015-1-17 05:32:29 | 只看该作者
大哥拜托,Java在95年就出来了,微软垄断个妹啊,服务器市场微软完全是后后来者,当年都是Unix的市场,现在被WindowsServer和Linux抢下大片,包括数据库也一样。
因胸联盟 该用户已被删除
板凳
发表于 2015-1-20 13:21:57 | 只看该作者
以上是语言本身的弱点,在功能方面ASP同样存在问题,第一是功能太弱,一些底层操作只能通过组件来完成,在这点上是远远比不上PHP/JSP,其次就是缺乏完善的纠错/调试功能,这点上ASP/PHP/JSP差不多。
愤怒的大鸟 该用户已被删除
地板
发表于 2015-1-29 07:35:18 | 只看该作者
我觉得什么语言,精通就好,你要做的就是比其他80%的人都厉害,你就能得到只有20%的人才能得到的高薪。
简单生活 该用户已被删除
5#
发表于 2015-2-6 00:02:26 | 只看该作者
asp.net最主要特性包括:◆编程代码更简洁◆网站可实现的功能更强大◆运行效率高◆节省服务器的动作资源
只想知道 该用户已被删除
6#
发表于 2015-2-14 11:33:38 | 只看该作者
目前在微软的.net战略中新推出的ASP.net借鉴了Java技术的优点,使用CSharp(C#)语言作为ASP.net的推荐语言,同时改进了以前ASP的安全性差等缺点。但是,使用ASP/ASP.net仍有一定的局限性,因为从某种角度来说它们只能在微软的WindowsNT/2000/XP+IIS的服务器平台上良好运行(虽然像ChilliSoft提供了在UNIX/Linux上运行ASP的解决方案.
爱飞 该用户已被删除
7#
发表于 2015-3-4 05:55:11 | 只看该作者
ASP.NET可以无缝地与WYSIWYGHTML编辑器和其他编程工具(包括MicrosoftVisualStudio.NET)一起工作。这不仅使得Web开发更加方便,而且还能提供这些工具必须提供的所有优点,包括开发人员可以用来将服务器控件拖放到Web页的GUI和完全集成的调试支持。微软为ASP.net设计了这样一些策略:易于写出结构清晰的代码、代码易于重用和共享、可用编译类语言编写等等,目的是让程序员更容易开发出Web应用,满足计算向Web转移的战略需要。
莫相离 该用户已被删除
8#
发表于 2015-3-11 17:40:34 | 只看该作者
JSP/Servlet虽然在国内目前的应用并不广泛,但是其前途不可限量。
兰色精灵 该用户已被删除
9#
发表于 2015-3-19 04:17:23 | 只看该作者
有一丝可惜的是,这个系列太强了,Java阵营的朋友根本就是哑口无言...争论之火瞬间被浇灭,这不是我想这么早就看到的,但是值了。
分手快乐 该用户已被删除
10#
发表于 2015-3-27 07:37:23 | 只看该作者
目前在微软的.net战略中新推出的ASP.net借鉴了Java技术的优点,使用CSharp(C#)语言作为ASP.net的推荐语言,同时改进了以前ASP的安全性差等缺点。但是,使用ASP/ASP.net仍有一定的局限性,因为从某种角度来说它们只能在微软的WindowsNT/2000/XP+IIS的服务器平台上良好运行(虽然像ChilliSoft提供了在UNIX/Linux上运行ASP的解决方案.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 12:24

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表