仓酷云

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

[学习教程] ASP.NET教程之挽救C# 2.0,可是我们真做的到吗?仓酷云

[复制链接]
柔情似水 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:21:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
如果英语好,口才好,加上女孩子的优势说不定有机会进去做做别的工具)  仿佛另有很多项目在用C#2.0(本文最初我们来做一个查询拜访),可是C#2.0的临盆力其实不如C#3.0——假如您不信,那末一会儿就会心识到这一点。有伴侣以为言语才能不主要,有了好用的框架/类库也能够有很高的临盆力。以是这篇文章,我们就想法利用“类库”来填补C#2.0的缺点。
  可是,我们真做的到吗?
C#2.0之殇
  C#2.0较C#1.0来讲是一个冲破,个中引进了泛型,和匿名办法等新特征。假如前者还能够说是平台的加强,而言语只是个“帮助”的话,尔后者则百分之一百是编译器的邪术了。别小视这个特征,它为C#3.0的高临盆力踏出了坚固的一步——不外仍是差了良多。比方,我们有一个请求:“把一个字符串数组中的元素转化为整数,再将个中的偶数放进一个List<int>容器中”。假如是C#3.0,这是再复杂不外的功效:
string[]strArray={"1","2","3","4"};vareven=strArray.Select(s=>Int32.Parse(s)).Where(i=>i%2==0).ToList();
  那末关于C#2.0(固然关于C#1.0也一样),代码又该怎样写呢?
List<int>even=newList<int>();foreach(stringsinstrArray){inti=Int32.Parse(s);if(i%2==0){even.Add(i);}}
  有人说函数式编程有甚么用,C#3.0就是个很好的证实。C#3.0中引进了Lambda表达式,加强了在言语中机关匿名办法的才能——这是一个言语中函数式编程特征的必备前提。C#3.0的完成与C#2.0比拟,可读性高,能够间接看出转化、过滤,和机关容器的历程和尺度。因为言语才能的加强,程序的体现才能失掉了很年夜的进步,在良多时分,我们能够省往将一些代码提取为自力办法的需要。固然,即便您将其提取为分外的办法,C#3.0也能够让您写出更少的代码。
  假如您以为以上代码的差异还不是过于分明的话——那末以下功效呢?
int[]intArray={1,2,3,4,5,6,7,8,9,10};//一切偶数的均匀数varevenAverage=intArray.Where(i=>i%2==0).Average();//都是偶数?varallEven=intArray.All(i=>i%2==0);//包括偶数?varcontainsEven=intArray.Any(i=>i%2==0);//第4到第8个数varfourthToEighth=intArray.Skip(3).Take(5);
  假如您利用C#2.0来写,您会怎样做?
挽救C#2.0
  C#3.0经由过程引进了函数式编程特征年夜幅加强了言语的临盆力。假如说C#2.0和Java还没有太年夜差异的话,那末C#3.0已将Java甩开地太远太远。不外真要提及来,在Java中并不是不成以到场函数式编程的理念。只不外,假如没有充足的言语特征举行撑持(如疾速机关匿名函数、闭包、必定水平的范例推演等等),函数式编程关于某些言语来讲几近只能成为“理念”。不外如今,我们临时先放下对“函数式编程”相干内容的探究,想法挽救C#2.0所缺掉的临盆力吧。
  C#3.0中可使用Lambda表达式机关一个匿名函数,这个才能实在在C#2.0中也有。我们临时以为这点不是形成差异的次要缘故原由,那末有一点是C#2.0相对没法完成的,那就是“扩大办法”。C#3.0中的扩大办法,能够“零耦合”地为一个,乃至一系列范例增加“实例办法”。固然,这也是编译器的功效,实践上我们只是界说了一些静态办法罢了。这一点在C#2.0中仍是能够做到的:
publicclassEnumerable{publicstaticIEnumerable<T>Where<T>(Func<T,bool>predicate,IEnumerable<T>source){foreach(Titeminsource){if(predicate(item)){yieldreturnitem;}}}publicstaticIEnumerable<TResult>Select<T,TResult>(Func<T,TResult>selector,IEnumerable<T>source){foreach(Titeminsource){yieldreturnselector(item);}}publicstaticList<T>ToList<T>(IEnumerable<T>source){List<T>list=newList<T>();foreach(Titeminsource){list.Add(item);}returnlist;}}
  因而如今,我们即可以换种写法来完成不异的功效了:
string[]strArray={"1","2","3","4"};List<int>even=Enumerable.ToList(Enumerable.Where(delegate(inti){returni%2==0;},Enumerable.Select(delegate(strings){returnInt32.Parse(s);},strArray)));
  即便您能够承受delegate关头字机关匿名函数的才能,可是下面的做法仍是有个生成的缺点:逻辑与体现的序次想反。我们想体现的逻辑按次为:转化(Select)、过滤(Where)、及容器机关(ToList),C#3.0所体现出的按次和它不异,而C#2.0的按次则相反。因为言语才能的缺掉,这个差异没法填补。良多时分,言语的一些“小功效”其实不能说是无关紧要的特征,它极可能间接决意了是不是能够用某种言语来机关InternalDSL或举行BDD。比方,因为F#的天真语法,FsTest使得开辟职员能够写出"foobar"|>shouldcontains"foo"如许的语句来制止机器的Assert语法。一样,我也已经利用actor<=msg如许的逻辑来替换actor.Post(msg)的显式挪用体例。
封装逻辑
  既然没有“扩大办法”,我们要制止静态办法的挪用情势,那末就只能在一个类中界说逻辑了。这点其实不坚苦,究竟在API的计划开展至今,已进进了存眷FluentInterface的阶段,这方面已堆集了大批的理论。因而我们机关一个Enumerable<T>类,封装IEnumerable<T>对象,以此作为扩大的出口:
publicclassEnumerable<T>{privateIEnumerable<T>m_source;publicEnumerable(IEnumerable<T>source){if(source==null)thrownewArgumentNullException("source");this.m_source=source;}...}
  并以此界说所需的Select和Where办法:
publicEnumerable<T>Where(Func<T,bool>predicate){if(predicate==null)thrownewArgumentNullException("predicate");returnnewEnumerable<T>(Where(this.m_source,predicate));}privatestaticIEnumerable<T>Where(IEnumerable<T>source,Func<T,bool>predicate){foreach(Titeminsource){if(predicate(item)){yieldreturnitem;}}}publicEnumerable<TResult>Select<TResult>(Func<T,TResult>selector){if(selector==null)thrownewArgumentNullException("selector");returnnewEnumerable<TResult>(Select(this.m_source,selector));}privatestaticIEnumerable<TResult>Select<TResult>(IEnumerable<T>source,Func<T,TResult>selector){foreach(Titeminsource){yieldreturnselector(item);}}
  这些扩大都是些高阶函数,也都有提早效果,信任很简单了解,在此就未几作注释了。在这里我们间接察看其利用体例:
List<int>even=newEnumerable<string>(strArray).Select(delegate(strings){returnInt32.Parse(s);}).Where(delegate(inti){returni%2==0;}).ToList();
  不晓得您对此有何感到?
  我对此其实不中意,特别是和C#3.0相较之下。我们固然界说了Enumerable封装类,并供应了Select和Where等逻辑,可是因为匿名函数的机关仍是较为丑恶。利用delegate机关匿名函数仍是引发了很多乐音:


  • 与JavaScript的function关头字,和VB.NET的Function关头字一样,C#2.0在机关匿名函数时没法省确delegate关头字。
  • 与C#3.0中的Lambda表达式比拟,利用delegate匿名函数短少了需要的范例推演。
  • 利用delegate机关匿名函数时必需供应完全的办法体,也就是只能供应“语句”,而不克不及仅为一个“表达式”,因而return和最初的分号没法省确。
  我们想法挽救C#2.0,可是我们真的做到了吗?
  框架/类库真能填补言语的临盆力吗?
再谈Java言语
  我对与Java言语的印象十分差,至今没有任何改动——不知此次还会有几人利用“Java平台”举行辩驳。
  博客园中的一名高人也已经在文章开端发问“您是不是出格会商某种言语,请您细心思索一下,这个结论站的住脚吗?”——固然是“疑问句”,可是大家都听的出个中的意义嘛!在国际常常听到一些说法,说对照言语,议论言语是没有代价的。那末会商哪些工具有代价呢?编程才能(这个切实其实很主要),办理计划(比方XX编程三百问)……哦,另有“营业”(手艺无用论?)。总之,会商言语,评价言语在国际社区显得很“急躁”,没有条理。实在对言语的会商外行业内长短常主要的一个方面,很多国际“精英”非常崇敬本国手艺职员们对这些话题的争辩才叫一个强烈热闹。我弄不懂的是,为何这些精英一边看轻国际手艺职员,一边崇敬老外,一边却看轻老外也喜好会商的内容呢?
  “玉轮老是本国的圆”,这句话说得真tmd有事理呀。
  我们要否决的不该该是“会商言语”,而是应当否决会商言语的不良目标。比方有人会商言语的目标是为了“彰显品德”,是为了冷笑别人,是为了找出哪一种言语“更有出路”,这些才应当是我们必要激烈抵抗的。一个类比就是:搓麻将没有错,错的是用麻未来打赌。“做甚么”和“怎样做”,二者是有良多区分的。
  C#3.0中关于汇合的操纵体例切实其实好用。Java社区也机关一个项目lambdaj,但愿能够减缓一下这方面操纵的方便。这个项目很风趣,关于编写FluentInterface是一个不错的参考。
  固然,假如真要我选择,我会利用Scala,它真比Java很多多少了。
总结
  本文议论了C#2.0在汇合操纵方面与C#3.0的差异。我提出了一种办理办法,可是自以为效果不甚幻想。不外聊胜于无,假如能够把C#3.0这方面的功效移植过去,也算是略有好事的事变——可是最好仍是尽快晋级到C#3.0吧。C#4.0?这切实其实是个好工具,不外光从言语层面上讲,个中的新特征(如dynamic和协变逆变)对我没有太年夜的吸引力。不外.NET4.0关于框架类库的加强切实其实十分有目共睹,假如能够的话,我也但愿能够尽快利用.NET4.0举行开辟。
本文来自:http://www.ckuyun.com/JeffreyZhao/archive/2009/06/27/try-to-make-a-better-csharp-2.html
学习asp.net两个月有余了,除了对html、web控件比较熟悉(应该是说都能理解和接受)之外,竟不知道自己还会什么。看了两本书:《精通asp.net网络编程》(人民邮电出版社)、《asp.net实用案例教程》(清华大学出版社)。
再现理想 该用户已被删除
沙发
发表于 2015-1-20 21:46:59 | 只看该作者
主流网站开发语言之PHPHP的全名非常有趣,它是一个巢状的缩写名称——“PHP:HypertextPreprocessor”,打开缩写还是缩写。PHP是一种HTML内嵌式的语言(就像上面讲的ASP那样)。而PHP独特的语法混合了C,Java,Perl以及PHP式的新语法。它可以比CGI或者Perl更快速地执行动态网页。
乐观 该用户已被删除
板凳
发表于 2015-1-22 10:13:09 | 只看该作者
PHP的源代码完全公开,在OpenSource意识抬头的今天,它更是这方面的中流砥柱。不断地有新的函数库加入,以及不停地更新,使得PHP无论在UNIX或是Win32的平台上都可以有更多新的功能。它提供丰富的函数,使得在程式设计方面有着更好的资源。目前PHP的最新版本为4.1.1,它可以在Win32以及UNIX/Linux等几乎所有的平台上良好工作。PHP在4.0版后使用了全新的Zend引擎,其在最佳化之后的效率,比较传统CGI或者ASP等技术有了更好的表现。
小女巫 该用户已被删除
地板
发表于 2015-1-31 05:58:12 | 只看该作者
关于ASP.NET功能上,ASP.NET比微软以前的ASP(96年出现)有更强大的library,更好的稳定性。ASP.NET可以使用.NETFramework中所有组件(也就是说.NET能实现的,ASP.NET一样能实现)。
谁可相欹 该用户已被删除
5#
发表于 2015-2-3 12:51:13 | 只看该作者
可以通过在现有ASP应用程序中逐渐添加ASP.NET功能,随时增强ASP应用程序的功能。ASP.NET是一个已编译的、基于.NET的环境,可以用任何与.NET兼容的语言(包括VisualBasic.NET、C#和JScript.NET.)创作应用程序。另外,任何ASP.NET应用程序都可以使用整个.NETFramework。开发人员可以方便地获得这些技术的优点,其中包括托管的公共语言运行库环境、类型安全、继承等等。
6#
发表于 2015-2-9 01:32:55 | 只看该作者
同时也感谢博客园给我们这个平台,也感谢博客园的编辑们做成专题引来这么多高人指点。
冷月葬花魂 该用户已被删除
7#
发表于 2015-2-23 10:19:17 | 只看该作者
弱类型造成潜在的出错可能:尽管弱数据类型的编程语言使用起来回方便一些,但相对于它所造成的出错几率是远远得不偿失的。
柔情似水 该用户已被删除
8#
 楼主| 发表于 2015-3-6 22:24:00 | 只看该作者
ASP.NET:ASP.net是Microsoft.net的一部分,作为战略产品,不仅仅是ActiveServerPage(ASP)的下一个版本;它还提供了一个统一的Web开发模型,其中包括开发人员生成企业级Web应用程序所需的各种服务。ASP.NET的语法在很大程度上与ASP兼容,同时它还提供一种新的编程模型和结构,可生成伸缩性和稳定性更好的应用程序,并提供更好的安全保护。
海妖 该用户已被删除
9#
发表于 2015-3-11 19:21:55 | 只看该作者
由于JSP/Servlet都是基于Java的,所以它们也有Java语言的最大优点——平台无关性,也就是所谓的“一次编写,随处运行(WORA–WriteOnce,RunAnywhere)”。除了这个优点,JSP/Servlet的效率以及安全性也是相当惊人的。
飘灵儿 该用户已被删除
10#
发表于 2015-3-19 09:15:53 | 只看该作者
PHP的源代码完全公开,在OpenSource意识抬头的今天,它更是这方面的中流砥柱。不断地有新的函数库加入,以及不停地更新,使得PHP无论在UNIX或是Win32的平台上都可以有更多新的功能。它提供丰富的函数,使得在程式设计方面有着更好的资源。目前PHP的最新版本为4.1.1,它可以在Win32以及UNIX/Linux等几乎所有的平台上良好工作。PHP在4.0版后使用了全新的Zend引擎,其在最佳化之后的效率,比较传统CGI或者ASP等技术有了更好的表现。
愤怒的大鸟 该用户已被删除
11#
发表于 2015-3-27 16:10:56 | 只看该作者
现在主流的网站开发语言无外乎asp、php、asp.net、jsp等。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-22 23:35

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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