上篇《学了.Net做什么开发》中我讲到了目前.Net开发主要方向是Web开发,因此在本篇中我将主要讲解做Web开发要学哪些东西,怎么学,由于内容比较多,我将分几次发。下图是我推荐的学习内容和学习顺序(除了这里列出的内容,要走向高手之路肯定还有更多技术需要学习,我这里只是对于初学者列出的主干学习内容,并不是全部):
开发者口中的.Net全称是.Net Framework,在中国大陆,一般将.Net读作“道特耐特”(中文音标比英文音标更好读,呵呵)或者“点耐特”。.Net是微软推出的一门技术,它是一个技术平台,基于这个平台进行开发可以简化很多工作。关于到底什么是.Net,不是一两句话能说清楚的,而且也没办法让初学者理解到底什么是.Net,因此你只要记住.Net这个词,随着我们越学越深入,你就会理解.Net到底是什么东西了。
基于.Net平台上有很多语言,比如C#、VB.Net、IronPython、F#、Powershell等,F#、Powershell是满足特定用途的语言,IronPython、IronRuby等并没有广泛应用,VB.Net是仅次于C#的第二大基于.Net的语言,不过按照微软的战略是把主要精力放到C#上,VB.Net只是微软为了将VB开发人员平滑的转移到.Net平台下的语言。因此对于语言来说大家学习C#即可。C#在中国大陆的叫法一般是“C sharp(C煞普)”,也有少数人读成“C井”,我不推荐这种叫法。
初学者可能会弄不清C#和.Net的关系,.Net是一个技术平台,而C#是这个技术平台上的一门语言,就像Windows是一个操作系统,而Word、QQ、FireFox则是在Windows上运行的一个程序。初学者不必纠结于这个概念,不是很明白也没关系。
.Net的开发工具是VisualStudio,VisualStudio现在有VisualStudio2005、VisualStudio2008、VisualStudio2010等版本,注意不要纠结于“到底装VisualStudio2005还是VisualStudio2008,听说有的公司还在用VisualStudio2005”、“到底是用新版本的VisualStudio2010还是用VisualStudio2008”这样的问题,因为这些版本并没有本质的不同,使用方法都类似,就像你会用WindowsXP,换了Windows7以后经过短暂的熟练会用Windows7了一样。因为VisualStudio2010比较消耗资源,如果你的计算机配置较好可以安装VisualStudio2010,如果配置较差则推荐安装VisualStudio2008。
要学习Web开发一定要按照正确的顺序进行学习,很多人被一些《21天精通***》这样的垃圾书的影响,不学C#、不学.Net Framework、不学Dom,直接上来就学ASP.Net,拖两个控件、配两个属性、双击控件写一个事件响应方法,就开始自诩“精通ASP.Net”了,照着书控件拖来拖去,可是连C#、.Net、ASP.Net、HTML、JavaScript之前的关系是什么都不清楚,闹出了很多笑话。欲速则不达,速成的结果就是以后浪费更多的时间,回想这么多年你走过的路,有多少次为了走快点就跳着走,最后又浪费时间返工的事情,按照正确的顺序才能更快、更好的掌握.Net。
有的人可能认为“我不想成为高手,有一口饭吃就行了,会拖控件就行了呗”,千万不要以为会“不拖控件的开发”就是高手了,高手没有那么好当的。我没有奢求学编程的人个个都是以“成为世界顶尖级程序员”、“国内.Net开发者中的知名开发者”为目标,这个也不现实,大部分人学编程只是看做软件开发工资不低,想赚几年钱娶媳妇生娃,这种想法并不是多没出息的想法,毕竟“老婆孩子热炕头”是最朴实的幸福,你不需要背负“振兴中国软件产业”这种的重任,但是最起码应该找到一份不错的工作,工作几年以后能有钱交得起房子首付(对于大部分人来讲,能够交得起首付成为房奴都是很奢侈的事情)、每月供月供吧,如果只会拖控件的话就不是能不能成为高手的问题,而是能不能养家糊口的问题了。
下面来详细讲解学习的各个步骤:
一、C#面向过程编程。
学习C#语言分为C#面向过程编程和C#面向对象基础两部分。听到“C#面向过程编程”有人会问了“C#不是一门面向对象的语言吗,哪儿来的面向过程编程?”,其实面向对象不是代替面向过程的,面向对象是面向过程的一个补充和发展,面向过程就是代码逐行执行,面向过程就是if/else,面向过程就是for循环,面向过程就是变量、函数,C#中最基础的也是if、for、变量、函数等这些东西,这些东西就是C#的面向过程部分。对于编程的初学者来说,最难的不是类、继承、控件、ASP.Net、AJAX之类神乎其神的东西,而是“程序化的思维方式”,也就是怎么把一个问题的解决方式用计算机的思维方式进行描述。
我接到过很多想深入学习.Net学生的咨询,当我问到“你的.Net基础怎么样”的时候,很多人都回答“学过C#、.Net、ASP.Net,感觉基础还行”,但是我给了他一个很简单的题,比如“用for循环累加的方式计算1到100之间整数的和”、“提示用户输入两个数字,然后程序打印两个数字的和”,很多人都做不出来。
对于初学者来说先不用管面向对象、ASP.Net之类的东西迷惑,先学习用最朴实的for、if来编写程序,通过亲手编写练习题代码来逐渐形成程序化的思维方式,这个阶段也不要使用“看起来很酷”的WinForm或者ASP.Net页面来做,因为那样就会涉及到这个阶段不需要去了解的问题,先编写最简单的控制台程序就可以。推荐大家看我录制的视频教程《【传智播客.Net视频】第1季C#编程基础》,这个教程针对C#零基础的同学进行讲解,并且在课程中给出了非常多的练习,一定要自己亲手把代码熟练的写出来,记住是亲手写出来,而不是照着我的代码抄,更不能是看懂了我的代码就以为自己掌握了,要知道“看懂了”和“会写了”之间差着十万八千里呢。对于初学者来说一开始写那些练习可能有点困难,先理解我写的代码,然后自己总结成“先***后***,再***,如果***则***”这样的用语言描述的算法,然后照着算法描述自己写代码,发现有地方写起来遇到问题的话再参考我的代码,最后做到不用看我的代码、不用看算法描述也能把代码写出来,这样第一阶段的任务就完成了。下面列出我视频教程中的一些练习题,大家可以自测看这个阶段自己是否合格:
练习1:提示用户输入用户名,然后再提示输入密码,如果用户名是“admin”并且密码是“888888”,则提示正确,否则提示错误,如果用户名不是admin还提示用户用户名不存在。
练习2:提示用户输入年龄,如果大于等于18,则告知用户可以查看,如果小于10岁,则告知不允许查看,如果大于等于10岁,则提示用户是否继续查看(yes、no),如果输入的是yes则提示用户可以查看,否则提示不可以查看。(给出测试用例。)
练习3:从一个整数数组中取出最大的整数
练习4:计算一个整数数组的所有元素的和。
练习5:将一个字符串数组输出为|分割的形式,比如{“浮云”,”神马”,”穿梭”}数组输出为“浮云|神马|穿梭”。不要使用String.Join等.Net内置方法。
练习6:有一个整数数组,请声明一个字符串数组,将整数数组中的每一个元素的值转换为字符串保存到字符串数组中。
练习7:将一个字符串数组的元素的顺序进行反转。{"3","a","8","haha"} 转换为{"haha","8","a","3"}。提示:第i个和第length-i-1个进行交换。
学C#基础的时候的参考书推荐如下两本:
(1)《C#图解教程》,这本书讲的清晰易懂,不过部分内容安排顺序不合理,大家按照我视频中的顺序进行学习就可以。
(2)《C#入门经典》适合零基础的大部头,不过非常厚,采用的是老外的描述方式,中国人读起来有点别扭,而且中文版翻译的不是太好。
二、C#面向对象基础
初学者学面向对象的时候没必要(也做不到)把面向对象学的非常透、非常深,因为如果想深刻的理解面向对象,必须要有大量的编程经验才能真正体会面向对象到底是怎么回事、有什么好处。以前听到过有人建议初学者学习设计模式,我认为纯属误人子弟,对于初学者来说没有大量的编程经验,根本看不懂设计模式在说什么。这个阶段只要弄明白怎么声明类、什么是访问级别(主要是public、private)、什么是属性、字段、方法、什么是继承、什么是override就可以。面向对象有三个特性:封装、继承、多态。对于初学者来说理解多态是非常困难的也是没太大必要的,这个阶段只要能掌握封装和继承就可以。
三、简单的WinForm编程
WinForm是.Net中用来构建Windows窗体应用程序的技术,对于目前国内市场来讲一般也就是用来桌面版管理系统等的技术。有人会问“我们不是学B/S的ASP.Net开发吗?为什么还要学C/S的WinForm?”,一定要注意我在这段的标题写的是“简单的”WinForm。和ASP.Net比较起来,学WinForm需要学习的前置知识非常少,可以非常快的入手开发,而学习ASP.Net则需要先学习HTML、JavaScript、Dom等知识。这个阶段的学习重点不是WinForm本身,而是通过WinForm在案例中理解类、对象、属性、方法、事件、索引器等概念,我们是“借壳学习”,因此不用对WinForm的深入技术(比如控件美化、布局、PInvoke、托盘编程、高级控件、ActiveX等)浪费时间去研究。初学者很难把握WinForm学习的度,还是推荐大家参考看我录制的视频教程《【传智播客.Net视频】第3季WinForm基础》。
四、常用.Net Framework类
.Net Framework中的类是.Net中最丰富、最有价值的内容,.Net Framework中的类是和表现层无关的,也就是无论是在控制台中、WinForm中还是ASP.Net中都可以调用这些类,比如把一个字符串转换为整数都是使用Convert.ToInt32()这个方法,因此千万不能因为你是在控制台程序中写这些类就认为自己在“编写DOS程序”。
.Net Framework是非常庞大的,拥有上万个类,没必要把这几万个类掌握,在这个阶段把常用的.Net Framework类掌握了,会对后续阶段的学习非常有帮助。这些类包括:String类常用方法、StringBuilder类、IO类(FileStream、File、Path)、XML操作类、集合类(ArrayList、List<T>、Dictionary<K,V>)等。
五、SQL语句
这个阶段主要学习SQL语法,能够掌握常见的SQL语法。数据库管理系统有MSSQLServer、Oracle、MySQL、DB2、Access等,这些不同的系统对于数据库管理员来说使用方法各异,但是对于开发人员来说差不多,因为都是用的统一的操作语言“SQL”,通过SQL这门通用的语言,你可以和不同的数据库进行沟通,所以只要掌握了.Net开发最常用的MSSQLServer,以后根据工作的需要使用其他的数据库管理系统会非常简单。
现在企业招聘.Net开发人员的时候对于数据库考查非常多,甚至很多公司的笔试题中有1/3都是关于SQL语句、存储过程的,因此对于准备学习后找工作的同学来说必须把这部分内容学好。
这部分内容主要学习:MSSQLServer的简单管理,Select、Insert、Update、Delete语句,学完了这些内容就可以继续学习后续的ADO.Net了。学有余力的同学可以学习Join、Union、子查询、存储过程等高级的内容。
这部分内容学习时大家可以参考我的《程序员的SQL金典》这本书(我将近期发布这本书的全部免费电子版)和《 【传智播客.Net视频】第4季SQL从入门到提高》。这套视频教程。
六、ADO.Net
ADO.Net是.Net中用来访问数据库的技术,通过ADO.Net我们就能通过程序告诉数据库“请把年龄大于20岁的人员返回给我”。在学习ADO.Net之前一定要把常用的SQL语句掌握了,千万不能学了一句Select * from Persons就来学ADO.Net,否则可能会出现下面这个真实的故事中的笑话了:
我以前碰到过一个人写一个“查询学号为S001的学生的姓名”的功能,他这么写程序(示例性代码,不严谨):
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = “Select * from Persons”;
SqlDataReader reader = cmd.ExecuteReader();
while(reader.Read())
{
String no = (string)reader[ “No”];
if(no==” S001”)
{
string name = (string)reader[ “Name”];
MessageBox.Show(name);
}
}
看到这种写法相信所有人都要崩溃了,因为好像从来没学过where语句一样。因此必须在把常用的SQL语句掌握以后再来学ADO.Net。
这阶段的学习主要学习使用SqlConnection、SqlCommand(ExecuteNonQuery、ExecuteReader、ExecuteScalar)等类的使用、参数化查询等,掌握DataSet方式使用离线数据集,能够自己从头写一个SqlHelper类出来即可。
(注:这段我描述的是ADO.Net基于接口的编程,属于深入一点的知识,对于初学者来说如果看不懂也没关系,不用纠结于此)SqlConnection、SqlCommand等类是ADO.Net中用来连接MSSQLServer的类,连接Oracle等数据库则使用OracleConnection、OracleCommand等类,虽然看似不同的类,但是由于ADO.Net通过IDbConnection、IDbCommand等接口统一了类的方法,所以OracleConnection、OracleCommand等类的用法和SqlConnection、SqlCommand基本一样,而且如果通过DbProviderFactories进行基于接口的ADO.Net编程,那么编程的时候就是使用IDbConnection、IDbCommand接口,完全不用管SqlConnection、OracleConnection等这些不同的类。学有余力的同学可以深入研究一下ADO.Net的接口编程,会对你理解设计模式有很大的帮助。
七、HTML、JavaScript、DomHTML是对网页长什么样子的一个描述,也就是“这里显示一个超链接、那里显示一个按钮”都是通过HTML来进行描述的。HTML做出来的页面是静态、不变化,如果要实现“点击【计算】按钮的时候让表格放大显示”这样的动态效果,则要通过程序操作Dom,一般使用JavaScript这种脚本语言来操作Dom。
如果不想成为只会拖控件的开发人员的话,需要在学习ASP.Net之前把HTML、JavaScript、Dom这些好好学习。提到这一点有同学可能会提出异议“不是这样的呀,ASP.Net已经封装的很好了,拖几个控件上来就可以了,ASP.Net都帮我们生成HTML了,也不用学JavaScript,动态效果写C#代码就可以了”。
ASP.Net中这种拖ASP.Net控件的开发技术就叫做WebForm,微软的WebForm封装是非常伟大的技术,能够将复杂的Web开发简化到可以像开发WinForm程序一样点击,不得不佩服微软技术的强悍。使用WebForm我们就可以进行傻瓜化的开发, 要是每天的工作、做每个项目的时候都能一直这样“傻瓜”下去也是很美好的,但是很不幸有一些场合中是不能使用这种傻瓜化的开发方式的,举几个例子:
例子1:在网站的注册页面中让用户所在的省、市,提供两个下拉列表框(DropDownList),一个为省的列表框,一个为市的列表框,当用户选择不同的省的时候,市列表框中就列出这个省下的所有市供用户选择。
对于这样一个功能点,如果只会拖控件的人很可能会这么写(假设省列表框id为ddlProvince,市列表框id为ddlCity),在Page_Load中加载省列表到ddlProvince,然后在ddlProvince的SelectedIndexChanged事件中响应ddlProvince的选择变化,当ddlProvince选择变化后根据选中项来填充ddlCity。用这种方法实现最大的缺点就是页面会频繁的刷新,每次选择省以后页面都会唰一下的刷新一次,这在网速比较慢或者服务器压力比较大的时候是很慢的,而且用户体验很差。这种情况用JavaScript操作Dom的方法来操作才会比较好。
例子2:ASP.Net WebForm中可以使用UpdatePanel控件很轻松的实现AJAX效果,不用懂JavaScript、Dom、Json,把控件用UpdatePanel包裹起来AJAX效果就出来了。但是用UpdatePanel实现AJAX只能在对性能要求不高的场合使用,如果要开发互联网应用等对性能要求非常高的场合,UpdatePanel控件是没法使用的。这时候就需要手写实现AJAX,而手写AJAX则需要对JavaScript、Dom非常熟悉。
即使全部使用ASP.Net WebForm控件实现,也是需要对HTML熟悉才可以的,比如不可能项目中使用ListView控件默认生成的代码,都需要手动调整ListView的模板,而调整模板就需要手写HTML, 不是什么都“拖一拖”就行的。微软现在还推出了一个WebForm的兄弟产品:ASP.Net MVC,ASP.Net MVC并不是替代WebForm的,各有所长,但是因为ASP.Net MVC的优点,以后肯定会有越来越多的项目使用ASP.Net MVC。在 ASP.Net MVC中就没有WebForm中这么傻瓜化了,很多地方需要手写HTML代码,这就对HTML等要求更高。
上面讲了HTML、JavaScript、Dom的重要性,下面来讲一下具体要学哪些东西、怎么学。需要提前说明:Web开发中一个非常麻烦的一点就是HTML、Dom在不同浏览器有少量的差异性,也就是一段代码可能在IE中和FireFox中的效果不一样, 对于初学者来说暂时不需要管那些差异性,降低学习中不必要的难度,学习的时候以一个浏览器为主就可以了。
刚接触HTML的人可能感觉比较难,但是一旦熟悉了这种标签式的用法,HTML就变得非常简单了,HTML中标签比较多,标签的可用属性更多,做为一个初学者没必要把所有标签、属性都学习了,而且也不可能都掌握,把最常用的标签以及它们的常用属性掌握了即可,主要的标签有:p、br、div、font、a、input、img、li、table、select、textarea、span。 学习HTML的时候一定要坚持手写HTML,千万不要用VisualStudio、Dreamweaver等中的可视化的拖放方式来编写HTML页面,如果只会在设计器可视化拖出HTML页面的话,后面的学习会困难重重。HTML学习的一个目标就是能够完全手写一个很多网站都有的那种静态注册页面出来。
HTML中还有一个知识点:CSS,CSS是用来对页面进行美化的描述语言,通过CSS我们能够将按钮设置为红色或者给一个图片加上金色边框。CSS中有非常多的样式名,不需要掌握这么多样式名,学习的时候只要过一遍,大概知道每个样式名是做什么的就可以;也不需要学习怎么将页面做的看好,不需要研究那些好看的CSS效果到底是什么做出来的,因为那些工作是美工做的事情,即使是没有美工的小公司开发人员只要学会怎么“偷”别的网站做好的特效就可以了。初学者只要掌握几种CSS选择器和Div+CSS布局就可以。
和ASP.Net后台用C#写代码不一样,对于Web前台页面的动态效果一般使用JavaScript(不用学已经在Web前端中被淘汰的VBScript)来编写,因此需要首先掌握JavaScript语言,JavaScript和C#的语法一样都是C语言发展过来,很多语法都和C#差不多,因此不用再从头学JavaScript语法,只要学习JavaScript和C#相比特有的语法就可以。JavaScript语言也有很多可以很深入研究的东西,比如闭包、面向对象的实现等,但是除非做Web游戏开发、开发JavaScript库等对JavaScript要求非常高的领域,如果是开发互联网站、业务系统等(这占到公司项目中的大部分)对JavaScript并没有太高的要求,只要熟悉一下JavaScript的语法就可以,然后在后面的Dom中通过练习逐步熟悉JavaScript。对于初学者来说JavaScript到底学到什么程度是够用了是很难界定了,大家可以参考 《【传智播客.Net视频】第7季JavaScript》这套视频教程,然后学Dom的时候参考 《【传智播客.Net视频】第8季Dom》进一步练习就可以。
很多初学者刚接触Dom的时候总是想弄明白“到底什么是Dom”,劝大家没必要纠结于这些概念,只要知道它是干什么的就可以,“通过JavaScript调用Dom中的属性、方法就可以动态的操作HTML页面”、“getElementById就是Dom、btn1.value=’abc’就是dom、btn1.οnclick=myclick就是dom”,通过练习你就会明白这一点就可以了,咱们不是编教科书的,不用搞那些无聊的概念定义。
Dom的东西非常多,还是那个原则,不用什么都记住,主要掌握下面几点:事件、动态设置事件、setInterval定时器、event对象、getElementById、动态创建Dom元素(createElement、innerHTML、innerText)。掌握这些东西还是要通过大量的练习来掌握的,只要能把第8季Dom这套视频中的练习熟练写出来这几个阶段的目标就达到了。
JQuery目前是最火的一个JavaScript的库,千万不要以为是一个新的语言,听到过很多“Jquery是JavaScript的终结者,Jquery取代了JavaScript”的说法,殊不知,Jquery只是个JavaScript的一个封装库, 尽快Jquery语法看起来非常奇怪,但是Jquery确实是完全符合JavaScript语法的一个封装库。Jquery只是对Dom操作的一个封装,学之前需要Dom基础,否则学起来会很晕。我不建议初学者学完了Dom以后立即学Jquery,还是用Dom多写一些程序以后再来学Jquery才会掌握的又牢靠又快速,我讲课的时候就在讲完了Dom以后隔了8天的.Net高级技术才讲Jquery也是基于这个考虑。参考书可以看《锋利的JQuery》。
很多人被那些“短平快”ASP.Net的书误导了,开始学习就从Button控件、TextBox控件、Repeater控件、GridView控件开始学习,为庞大的ASP.Net体系所折服,看着千八百页的书感叹“晕呢,这么多控件、什么多方法、这么多属性哪辈子学完呀”。当然也有人会拖几个控件以后就自诩“精通ASP.Net”,“拖控件、设属性、写事件”靠此三招走天下,但是一旦遇到稍微复杂一点问题就懵了。
WebForm是微软的一个伟大的创造,能够将复杂的Web开发进行了屏蔽,能够让我们进行傻瓜化的开发,但是微软再怎么封装也不可能让我们一直“快乐的傻下去”,不了解Http、不了解“请求—处理—响应”的模型、不了解ASP.Net的内部原理,那么遇到一些稍微复杂一点的问题的话就会感觉很茫然。一旦了解了Http、 ASP.Net的原理以后再去学ASP.Net你就能知道那些控件到底帮我们做了什么,这样就可以轻松的掌握那些控件,不是成为控件的奴隶,而是成为控件的主人,让控件为我们所用。正是基于这样的原则,我在传智播客.net班讲ASP.Net基础的时候,我没有立即讲解那些控件怎么用,而是使用了4天的时间来讲Http协议、Web开发基本原则、“请求—处理—响应”模型、基于HttpHandler开发Web应用、ViewState原理、IsPostBack原理、XSS漏洞等基础的东西,前4天的内容是难度非常高的东西,一旦把这4天的内容掌握了,后面用几天时间学员们就能掌握ASP.Net的基础的东西,而且掌握的非常深入、牢固,如果对这个感兴趣可以参考我的《【传智播客.Net视频】ASP.Net》上中下三季内容。
特别是以后会在ASP.Net开发中占有一席之地的ASP.Net MVC更是摒弃了ASP.Net WebForm中复杂的事件驱动、属性等非Web本源的东西,ASP.Net MVC回归了Web开发的本质,把Web开发重新用“请求→处理→响应”这样一个最简单的模型进行描述,其实是比ASP.Net WebForm更简单,但是如果只会用ASP.net WebForm进行拖控件开发,那么如果需要用到ASP.Net MVC就会非常不适应。
学习WebForm的时候一定要先掌握不使用WebForm进行Web开发的技术,因为有的项目中如果完全使用WebForm中的服务端进行开发就会有性能等问题,因此这些项目中会不允许使用服务端控件或者不允许使用服务端控件的某些特性。服务端控件必须学,因为很多功能点中用服务端控件会“多快好省”,但是不要离了服务端控件就活不了。
WebForm中并不是所有控件都是常用的,初学者的目的是用最短的时间学最有用的内容。工具箱中“标准”中常用的控件如下:Label、Button、LinkButton、ImageButton、HyperLink、DropDownList、ListBox、CheckBox、RadioButton、Literal、FileUpload。很多书上讲WebForm的时候讲把大量的篇幅放到GridView、DataList、DetailsView、Repeater、ListView等这些数据绑定控件上,其实这些控件大同小异,只要掌握了一个控件另外一个控件很容易掌握,推荐大家学习ListView和Repeater就够了。
上面我谈了学习.Net Web开发的的八步,这八步看似漫长,其实如果能把所有精力投入上面的话大约两个月就能学下来。当然学完了这些只是掌握了.Net开发的基础知识,还需要在项目开发中将这些基础知识进一步综合应用。