- 新手学ASP.NET 3.5网络开发
- 孔琳俊 陈松等编著
- 1302字
- 2024-12-23 09:39:45
第1篇 从零开始
0 学习Web开发必备知识
本章专门针对性完全没有Web开发基础的读者,从什么是网页开始讲起,一直到Web开发基础环境的搭建和配置。本书所有Web开发都是使用C#语言完成的,本章就C#的基本概念和基础语法,进行了详细的讲解。在开发工具方面,本书采用了微软最新推出的Visual Studio 2008开发套件,Internet信息配置是使用最新版本的IIS 7,浏览器使用的是IE 7.0。
本章从网页搭建、编程规范等非常基础的开发人员知识入手,介绍了C#的基本语法,C#开发的编码结构,以及C#编程中遇到的一些基本知识点,希望读者能有一个很好的入门。
0.1 基础概念
基础概念是学习一门技术的入门,在学习Web开发前,首先要明白Web开发的一些基本概念,如什么是网页,什么是Web开发,用什么技术可以完成一个网页,或者说,用什么技术能完成一个Web程序。本节将会对这些概念进行详细的解释。
0.1.1 什么是网页
网页是读者上网浏览时看到的页面,通过浏览器,呈现在电脑上,用户在浏览器的地址栏,输入一个网站地址,如“www.baidu.com”,则打开一个页面,如图0.1所示,这个页面就是我们常说的“网页”。网站是一个具有多个网页的站点,如“www.baidu.com”就是一个网站的地址,用户通过这个地址来访问网站,网站包含多个相关的网页。如图0.1所示的是打开的百度网站的主页。
图0.1 百度网站的主页
0.1.2 网页开发技术
网页分为动态网页和静态网页。如果要制作简单的静态网页,只需要学习HTML语言就可以,这是一门非常简单的语言,通过标签来完成基本网页设置。下面的代码是一个比较完整的HTML结构。
<html> <head> <!-- 网页的标题等标头内容 --> </head> <body> <-- 网页的主要内容 --> </body> </html>
其中标签都是成对出现的,如“<html></html>”,html是HTML语言开始的地方,代表这是一段HTML代码。“<head></head>”是一个页面的“头”,一般包括这个页面的主题和一些需要调用的页面样式等。“<body></body>”是页面的“身体”,主要在此处写页面的内容。下面通过一个完整的页面实例,看看一个简单的静态页面是什么样子,此页面的运行效果如图0.2所示,其中title表示当前页面的主题,显示在浏览器的顶端。
<html> <head> <title>第一个静态页面</title> </head> <body> 这是页面的主要内容 </body> </html>
图0.2 一个简单的静态网页
静态网页可以算是第一代网页,静态网页只显示基本内容,根本无法与用户交互。要想与用户交互,就需要动态网页,动态网页包括静态部分和动态部分,静态部分依然由HTML语言组成,而动态部分则由JavaScript和VBScript组成。因为VBScript只能用在IE浏览器上,所以JavaScript更为通用,可以用在任意浏览器上。下面是添加了JavaScript代码的动态网页,其中要在网页中添加JavaScript代码,必须添加“script”标记,而且需要使用“language”属性指明脚本使用的语言。
1. <html> 2. <head> 3. <title>第一个静态页面</title> 4. <script language="javascript"><!—指明脚本的语言 --> 5. function jiaohu() <!—按钮调用的方法--> 6. { 7. alert("您单击了提交按钮");<!- 单击按钮后弹出一个提示框--> 8. } 9. </script> 10. </head> 11. <body> 12. <input type="text"name="txt1"/> 13. <input type="button"name="btn1"value="提交"onclick="jiaohu()"/> 14. </body> 15. </html>
说明
具体的JavaScript语法可参考专业的JavaScript书籍。
上述代码生成的页面如图0.3所示,用户可以输入内容,单击“提交”按钮,浏览器会根据JavaScript的设计给出交互,其效果如图0.4所示。
图0.3 一个动态网页
图0.4 动态网页的交互
虽然JavaScript可以完成一些交互,但其不能访问数据库,不能完成大容量数据的提交和获取工作,所以一般都把JavaScript和VBScript称为脚本语言。除了脚本语言可以完成动态网页外,还有很多种服务器端开发语言,如ASP、JSP、ASP.NET等。这些服务器端语言,可以实现与数据库的交互,可以反馈数据给浏览器,可以实现用户与服务器的完整交互。本书要介绍的就是ASP.NET,确切地说,其不是一门语言,而是一门网页开发技术,其底层语言是C#语言,C#语言在后面会详细介绍。
0.1.3 Web开发相关技术
前面介绍了网页的分类,但网页和Web开发是什么关系呢?
网页属于Web开发的对象,或者说是Web开发的一部分,凡是使用浏览器来查看的程序,我们统称为Web应用程序,凡是用于开发Web应用程序的技术,本书统称为Web开发技术。
Web应用程序一般会分为两部分:前台开发和后台开发。
○ 前台开发:主要包括页面设计、样式布局、特效等。页面设计由基本的HTML和JavaScript完成,而样式布局和特效一般由CSS(样式表)完成。
○ 后台开发:可以与数据库交互的各种开发语言,如ASP.NET、Java、PHP等。一般由一些类库和包组成。如果使用ASP.NET,微软提供了一个.NET 3.5框架,其包含了Web开发所有需要的类库,开发人员可以轻松调用,完成非常复杂的功能。
0.2 搭建开发环境
在学习一门开发语言前,需要先把这门开发语言的开发环境搭建好。本书所使用的ASP.NET 3.5,需要安装Visual Studio 2008开发工具,此工具会自动安装类库需要的.NET 3.5框架。本节就介绍这个开发工具的安装过程。
0.2.1 安装Visual Studio 2008
Visual Studio.NET是微软公司推出的集成化互联网开发平台,利用它可以设计、开发以及调试部署Web应用程序。下面简要介绍Visual Studio 2008的安装。
1 插入Visual Studio 2008(以下简称VS2008)的安装光盘,弹出Visual Studio的安装起始界面,如图0.5所示。
图0.5 安装起始界面
提示
如果已经安装有VS 2008,则可以选择安装第二项,MSDN的帮助文档。如果不安装此文档,也可以到MSDN的网站,在线查看相关文档。
2 单击第一项“安装Visual Studio 2008”,系统弹出“Visual Studio 2008安装程序”对话框,如图0.6所示。
图0.6 “Visual Studio 2008安装程序”对话框
3 单击“下一步”按钮,系统弹出许可协议界面。
4 选择接受许可,然后在产品密钥中输入产品ID 号,输入名称。单击“下一步”按钮,弹出“选项页”对话框,选择所安装的功能和产品安装路径。
5 单击“安装”按钮,系统开始安装Visual Studio 2008,如图0.7所示。
图0.7 VS2008的安装界面
6 安装完成后,单击“完成”按钮,结束安装过程。
0.2.2 Visual Studio 2008 IDE简介
单击“开始|所有程序|Microsoft Visual Studio 2008”中的“Microsoft Visual Studio 2008”可执行文件,打开VS2008的开始界面,如图0.8所示。图中标注出了需要注意的各个区域。其中开始学习文档,提供一些入门者案例和文档,读者除了看书之外,也可以经常阅读这些文档,有助于了解一些更深入的知识点。VS开发新闻区域,如果连接了网络,则会显示一些最新的VS开发文档和注意事项。
图0.8 VS2008的开始界面
单击“文件|新建|项目”菜单,打开VS 2008提供的模板窗口,如图0.9所示。一定要注意“选择框架版本”列表框,这里默认是.NET 3.5框架,但其支持.NET 3.0和.NET 2.0框架版本。如果要开发旧版本的程序,可通过此列表选择。
图0.9 新建项目模板
0.2.3 实现第一个ASP.NET程序
单击“开始”|“所有程序”|“Microsoft Visual Studio 2008”中的“Microsoft Visual Studio 2008”命令,启动Visual Studio 2008,如图0.10所示。
图0.10 Visual Studio.NET起始页面
Visual Studio 2008提供了两种新建项目的方式:一种是在Visual Studio.NET的起始页的“最近的项目”选项卡中单击“新建”|“项目”命令,出现如图0.11所示的“新建网站”对话框;另一种是单击Visual Studio.NET的“文件”|“新建”|“网站”命令。
图0.11 “新建网站”对话框
Visual Studio.NET已经预定义了不同类型的网站模板,用户可以根据不同的开发任务选择其一。本书主要讲的是Visual C#开发ASP.NET网站。因此在“新建网站”对话框中,将“语言”选项设定为Visual C#,将“模板”选项设定为ASP.NET Web Site,在“位置”文本框中填入项目要保存的位置。单击“确定”按钮,新建了一个Visual C#项目中的ASP.NET网站应用程序,如图0.12所示。
图0.12 新建一个Visual C# ASP.NET项目
此时应用程序会生成两个文件:一个扩展名为“aspx”的文件和一个名字相同但扩展名为“cs”的文件。其中“aspx”文件是必需的,是ASP.NET程序的界面;“cs”是C#源代码文件的扩展名,C#源代码文件实现ASP.NET程序的功能。
在新的应用程序建立后,会生成一个空白窗体,也就是扩展名为“aspx”的文件。将其保存为“Default.aspx”。“Default.aspx”文件的代码如下:
1. <%@Page Language="C#"AutoEventWireup="true" CodeFile="Default.aspx.cs"Inherits="_Default"%> 2. <!DOCTYPE html PUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN" 3. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 4. <html xmlns="http://www.w3.org/1999/xhtml"> 5. <head runat="server"> 6. <title>无标题页</title> 7. </head> 8. <body> 9. <form id="form1"runat="server"> 10. <div> 11. 12. </div> 13. </form> 14. </body> 15. </html>
在<div>和</div>中间加入代码<asp:Label ID="tt" Runat="server" Font-Size = "30" Font-Italic="True"ForeColor="#485866">Study ASP.NET</asp:Label>,保存。然后运行这个例子,效果如图0.13所示。
图0.13 第一个ASP.NET程序
0.3 IIS 7 Web服务配置
IIS是Internet Information Server的简称。IIS作为当今流行的Web服务器之一,提供了强大的Internet和Intranet服务功能。在Windows的各个版本中,Windows的服务器版本通常默认安装IIS,而其他版本需要用户自行安装。例如,Windows XP Professional和Vista默认是不安装IIS,需要用户手动安装。
本节主要介绍IIS 7的安装和配置,主要操作系统是Windows Vista。
0.3.1 安装IIS 7
IIS 7不需要下载,一般都在Windows操作系统的安装盘内,具体安装步骤如下。
1 单击“开始”|“控制面板”|“程序和功能”命令,打开“卸载和更改程序”窗口。
2 单击左侧的“打开和关闭Windows功能”,弹出“Windows功能”对话框,如图0.14所示。
图0.14 “Windows功能”对话框
3 图0.14中可以找到Internet信息服务的选项,展开其所有节点,如图0.15所示。
图0.15 Internet信息服务的选项
4 一定要选中“Web管理工具”和“万维网服务”的所有内容,单击“确定”按钮,最后完成IIS安装。
安装完毕之后,要测试IIS 7.0安装是否正确。IIS 7.0正确安装之后,系统会自动建立一个默认Web站点。用户只需检验是否能够正确访问该网站,就可以判断IIS 7.0是否正确安装。具体操作步骤如下所列。
1 单击“开始”|“控制面板”命令,打开“控制面板”窗口。
2 双击“管理工具”图标,进入“管理工具”窗口。双击“Internet信息服务管理器”图标,打开“Internet信息服务管理器”窗口,如图0.16所示。
图0.16 “Internet信息服务管理器”窗口
3 在左侧的Default Web Site节点单击鼠标右键,在弹出的快捷菜单上选择“浏览”命令。系统会打开一个IE窗口显示该网页,如图0.17所示。
图0.17 IIS测试网页
用户也可以直接打开IE浏览器,在地址栏中输入本机的网址,可以是localhost/(localhost代表本机的默认网址)或者127.0.0.1/(IP地址127.0.0.1代表本机),查看是否能打开.asp或.aspx类型的文件。如果能正常打开,就证明IIS已经正确安装和运行了。
0.3.2 配置 IIS 7支持的.NET版本
默认的IIS服务器配置并不一定适合用户,通常需要进行一定的修改。例如,访问IP、主目录等。操作步骤如下所示。
1 打开“Internet信息服务管理器”窗口。
2 在“Default Web Site”节点上单击鼠标右键,在弹出的快捷菜单上选择“编辑绑定”命令,弹出“网站绑定”窗口,如图0.18所示。
图0.18 “网站绑定”对话框
3 选中默认的一条绑定记录,单击“编辑”按钮,选择IIS服务所使用的IP地址。如果选择了IP地址,客户端浏览器就可以通过IP地址来访问此网站,如图0.19所示。
图0.19 “编辑网站绑定”窗口
4 关闭这些窗口,右击“Default Web Site”节点,选择“高级属性”菜单,打开“高级设置”窗口,如图0.20所示。
图0.20 “高级设置”窗口
5 单击物理路径后面的“”按钮,可以更改网页文件的存放位置和起始位置。当安装完IIS 7.0时,默认的主目录是“C:\Inetpub\wwwroot\”。
说明
如果操作系统安装在D盘,则默认的主目录是“D:\Inetpub\wwwroot\”。
6 关闭所有窗口,单击“Default Web Site”,在其右侧的功能视图中可以看到有一项“默认文档”,双击此项后,打开的界面如图0.21所示。这里可以看到站点默认的首页名称为iisstart.htm、Default.htm 等。当用户直接访问网站时,服务器按照列表顺序依次寻找文档。用户也可以直接在文本框内添加新的文档。
图0.21 默认文档
0.3.3 浏览第一个ASP.NET程序
在设计好ASP.NET应用程序后,可以通过按“Ctrl+F5”键来运行程序。但所有的程序都是通过IIS来配置的,如果要使用本书的实例,需要先在IIS 7中配置好实例,才可以正常进行Web程序的浏览,本节以前面介绍的第一个实例为例,学习如何浏览Web程序。
1 打开IIS 7,右击“Default Web Site”节点,选择“添加应用程序”菜单,打开“添加应用程序”对话框,如图0.22所示。
图0.22 “添加应用程序”对话框
2 在“别名”文本框内,输入程序的名称,就是要浏览的程序的别名,本例为第一个程序命名为“FirstWeb”,单击“物理路径”文本框后面的“”按钮。打开“浏览文件夹”对话框,选择源代码所在的路径,如果是光盘文件,就选中光盘下的源代码文件夹。
3 添加完应用程序的别名和路径后,单击“确定”按钮。在“Default Web Site”节点下,就会生成一个名为“FirstWeb”的节点。右击此节点,选择“浏览”菜单,则会打开IE 浏览器,运行效果与前面创建的第一个ASP.NET程序相同。
注意
如果是在VS 2008中新创建的Web程序,会自动在IIS 7中生成一个应用程序节点。
0.4 C# 3.0语言基础
C#(读作C Sharp)是一门新兴的开发语言,本节主要介绍C#语言的由来,以及C#与以前的开发语言的区别,最后还介绍了C#在Web应用中的地位。
提示
当前的最新C#版本是.NET 3.5框架下的C# 3.0。
0.4.1 C#简介
对C#的由来有两种解释:从字面的意义来解释,是C语言的开发利器;从Microsoft给出的解释,是C++的升级语言,具有比C++更优越的开发特性。
C#是Web开发的一种重要语言,Microsoft将C#发展成为Java语言的重要对手。在Microsoft提供的.NET框架中,可以用C#开发C/S应用,也可以开发Web应用,并且可以在一个项目中混合使用C#和VB等语言,这从某种意义上讲,.NET框架和Java的虚拟机有很大的相似。C#的语法规则和C++非常相似,有C语言基础的开发者比较容易上手。
C#的优点概括如下:
○ 支持快速开发:快速开发曾经是VB语言的一大特色,而C#整合了这种特色,借助于Visual Studio开发工具,可以通过拖放的形式添加组件,并自动生成组件需要的代码,同时在VS 2008中,自动生成的代码与手动控制的代码相隔离,让开发人员更容易地检查自己的设计。
○ 支持面向对象:面向对象(Object-Oriented)是开发程序的一种机制,是专指在程序设计中采用封装、继承、抽象等设计方法,其重点是类的设计。而C#中连一个字符串都是面向对象型的设计。
○ 对XML强大的支持:XML语言已经成为一种标准的数据描述语言,支持XML开发也成了衡量一种语言是否强大的标准。C#对XML语言的支持,体现在强有力的XML框架类中,尤其是命名空间“System.Xml”中,提供了一系列对XML读取的操作类,使XML程序的开发变得非常容易。
○ 面向组件的开发:面向组件是继面向对象后的又一流行趋势,属于设计方法的一种。在C#中最具特色的组件就是ADO.NET数据访问组件。组件设计也是C#考虑最多的一种形式,组件可以在开发中直接使用,也可以调用对象提供的方法来操作。
0.4.2 变量和常量
常量一般是程序中不变的数据,如2,“中国”等,常量也有不同的类型,如2属于数值型,而“中国”属于字符型。在C#中定义常量的语法如下所示。
public const string CHINA = "中国";
上述代码中,“const”是定义常量的标识,如果没有此标识,即使为“CHINA”指定固定的值,也不算是常量。“string”用来定义常量的类型,注意常量在命名时,通常使用大写字母。
变量就是经常发生变化的数据,如计算登录人数的变量“count”,可能随着登录用户的不断增加而变化。在C#中定义变量的语法如下所示。
public int count = 10;
其中“int”表示变量的类型,“count”表示变量名,变量名可以随意定义,但最好可以突出此变量的意义所在。注意变量名一般为英文。
变量可以不需要初始值,如下所示的定义也是正确的。
public int count;
C#中变量的类型可以概括为3种:文本类型、数值类型和其他类型。
(1)文本类型主要包括string和char,其中string用来存放字符串,char用来存放单个字符,两者的定义语法如下所示,其中string变量的值用双引号包括,而char变量的值用单引号包括。
string name = "欢迎到北京来"; char word = 'W';
(2)数值类型包含的内容比较多,如整数、浮点数、长整数等,表0.1列出了C#中常见的数值类型,并演示了使用这些类型的语法。
表0.1 C#中常见的数值类型
(3)其他类型主要包括日期型、Object类型和布尔型。其中Object是C#的通用类型,C#中所有的类型都是从Object发展而来的。下面演示这3种类型的使用语法。
DateTime date ; //日期型 object data; //object类型 bool ifExit = true; //布尔型
0.4.3 运算符
运算符是C#进行数据处理的基础,C#中的运算符主要分为5类:算术运算符、关系运算符、逻辑运算符、赋值运算符和“?”运算符。
1.算术运算符
算术运算符是常用的计算符号,如“+”、“-”、“*”、“/”等。算术运算符又分为一目运算符和二目运算符,其中一目指只有一个变量参与的运算,二目是指两个变量参与的运算。其中“+”、“-”、“*”、“/”这些运算符,必须有两个变量参与才可以实现运算,而“++”、“--”这种自增、自减的操作,只有一个变量参与。下面的代码演示了这些常用的算术运算符。
int a = 10; int b = 11; int add=a+b; //"+" int incre = b - a;//"-" int sum=a*b; //"*" a++; //自增 b--; //自减
2.逻辑运算符
逻辑运算符一般与关系运算符结合使用。关系运算符用来比较两个数据,如“= =”、“>=”等,而逻辑运算符用来判断两个或多个使用关系运算的语句。逻辑运算符包含的运算如表0.2所示。关系运算符包含的运算如表0.3所示。
表0.2 逻辑运算符包含的运算
表0.3 关系运算符包含的运算
下面的代码演示了逻辑运算符和关系运算符的使用。
int a = 10; int b = 11; if(a>b) //关系运算符 label2.Text = (a + b).ToString(); if ((a <= b) || (a <= 11)) //逻辑运算符和关系运算 label2.Text = a.ToString(); if (a > 0 && b > 0)//逻辑运算符和关系运算 label2.Text = b.ToString();
3.赋值运算符
赋值运算符是C#最基本的运算,就是为某个变量指定值。“int a=10;”是一个最简单的赋值运算,“等号”左边一般为变量的名称,右边为变量的值,有时候右边也可能是另一个变量。下面演示常用的赋值运算。
int a = 0; int b; if(a!=0) //关系运算 b=a; //赋值运算 else b=a++; //赋值运算
4.?运算符
?运算符通常被称为三目运算符,因为有3个变量参与其中。下面代码是一个很简单的?运算。
b = (a > 0) ? a : a++;
上述表达式中有两个关键符号“?”和“:”,其中?前边通常是一个关系运算,?后面紧跟两个变量。?运算符的意思是判断?前面的表达式,如果表达式结果为true,则选择?后面的第一个值,如果表达式结果为false,则选择?后面的第二个值,两个值之间以“:”间隔。
下面代码中,b的值为“1”。
int a = 1; int b; b=(a>0)?a:a++; //?运算
0.4.4 流程控制
一个应用程序,通常包含了复杂的应用逻辑,要实现这些逻辑,就必须进行流程控制,本节介绍C#常用的5种流程控制语句:if、switch、for、foreach、while。
1.if语句
if语句用来判断条件,符合条件则进入if语句的代码块,不符合则执行if代码块后面的内容。if语句的语法如下所示。
if(a >0){}
如果有多个判断条件,可以使用if…else if的组合语句,使用语法如下所示。
if(a>0){ } else if(a=0){ } else if(a<0){ }
如果有且只有两个判断条件,可以使用if…else…的组合语句,使用语法如下所示。
if (a > 0) { }
else { }
以下代码演示了一个实例,判断a是否大于10,如果大于10,则a自减,否则a自增。
int a=15; if (a > 10) //是否大于10 { a--; } else { a++; }
2.switch语句
switch语句也是条件判断语句,其主要用于两个以上条件的判断。switch语句的语法如下所示。
1. switch() 2. { 3. case"": 4. break; 5. case"": 6. break; 7. default: 8. break; 9. }
上述代码中,switch后面括号中的内容表示要判断的值。语句中的case关键字,表示一种判断。关键字break表示此次判断结束并返回。default关键字是指如果括号中的内容与以上的所有case都不相符时默认的执行语句。
在下面演示代码中,welcome的值最终为“奥运北京”。
1. string city="北京"; 2. string welcome; 3. switch(city) 4. { 5. case"北京": 6. welcome="奥运北京"; 7. break; 8. case"上海": 9. welcome="上海世博"; 10. break; 11. default: 12. welcome="欢迎您来到中国"; 13 14. }
3.for语句
for语句表示一个循环,其语法如下所示。其中布尔表达式是允许执行循环的条件。注意括号中的三个数据以“;”间隔。
for(初始值;布尔表达式;更新值)
下面的代码是一个例子,演示如何输出1~10的数字。其中初始值为1,条件是i<11,每次循环后i自增。
String str=""; for (int i = 1; i < 11; i++) { str=str+i.ToString(); } label2.Text=str;
4.foreach语句
foreach也是一个循环,通常用其实现对集合的遍历,因为此循环的条件不是布尔表达式,而是获取集合中的所有对象。foreach的使用语法如下所示。
foreach(集合个例 变量名 in 集合)
下面的代码演示了一个字符串数组的遍历过程。
//定义一个字符串数组 string[] arrayStr = new string[] { "北京", "上海", "深圳" }; string strLong=""; foreach (string str in arrayStr)//遍历数组中的每个字符串 { strLong = strLong + str; //连接字符串 } label2.Text= strLong;
5.while语句
while语句是一个标准循环,其语法如下所示。判断布尔表达式的值,如果值为true,则执行循环语句的内容,否则不执行。
while(布尔表达式)
下面的代码输出1~10个数字,排列顺序为倒序。每次执行一次循环,a都自减,当a=0时就不再执行循环。
int a=10; string str=""; while (a > 0) { str=str+a.ToString(); a--; } label2.Text=str;
0.4.5 隐性局部变量
在JavaScript中,一般不用int、string等来定义变量,而是直接用var,这一直被认为是类型不安全的表现。在C#3.0中,依然引入了“var”关键字,但C#的类型转换机制提供了类型安全的保障。下面是几个常见的隐性局部变量。
var i = 6; var str = " hello world"; var d = 20.12; var myary=new int[]{1,2,3,4,5};
上面的变量都使用了var关键字定义,其效果类似于下面的代码。
int i =6; string str = " hello world"; double d = 20.12; int[]myary=new int[]{1,2,3,4,5};
var的用法比较简单,但需要注意以下几点:
○ var必须包含初始化器。
○ 初始化器必须是一个表达式。
○ 初始化器的编译器类型不能是Null类型。
○ 如果局部变量声明了多个声明符,这些变量必须具备相同的编译器类型。
0.4.6 Lambda表达式
Lambda表达式和匿名方法有关,是一种简约化表述匿名方法的函数表达式。其表述语法如下所示,类似于C++的指针。
Param => Expr;
Lambda表达式的作用,就是提供一种更简练的方法,来书写匿名方法,最常用在泛型匿名方法的简化上。下面是一个通过匿名方法匹配字符串的实例。
1. static void Main(string[]args) 2. { 3. string[]list=new string[]{"efgcd","ef","jsp","asp.net","php"}; 4. string[]listAfter=Array.FindAll(list, //利用委托进行匹配 5. delegate(string s) 6. { 7. return s.IndexOf("ef")>=0; 8. } 9. ); 10. foreach(string str in listAfter) //输出满足条件的字符串 11. { 12. Console.WriteLine(str); 13. } 14. }
下面使用Lambda表达式修订上面的方法。
static void Main(string[] args) { string[]list=new string[]{"efgcd","ef","jsp","asp.net","php" }; //使用Lambda表达式 string[]listAfter=Array.FindAll(list,s=>(s.IndexOf("ef")>=0)); //输出满足条件的字符串 foreach(string str in listAfter) { Console.WriteLine(str); } }
可以看到“s => (s.IndexOf("ef") >= 0)”表达式的写法更简单,缺点就是刚开始读起来有些费劲。
0.4.7 LINQ集成查询概述
在查询数据库时,通常使用SQL语言来实现数据的存储和读取,而在C# 3.0中,提出了新的集成查询语言LINQ。LINQ之所以成为集成查询语言,是因为其不仅可以查询数据库,还可以查询对象。本节介绍基本的LINQ查询语法,具体的LINQ to SQL方法,会在第11章介绍。
本节介绍的LINQ语法主要针对SQL语法而言,把常用的SQL语法转化为LINQ。
1.where语句
where语句用来查询数据中符合条件的记录。在LINQ中,where语句的语法如下所示。
from c in customs where c.city == "beijing" select c
其中表名是“customs”,而表的别名是c,查询条件是“city="beijing"”。
2.select语句
Select语句用来选择需要显示的字段,如果要显示全部字段,则语法如下所示。
from c in customs where c.city == "beijing" select c
如果要显示某一个字段,则语法如下所示。
from c in customs where c.city == "北京" select c.name
3.group语句
group语句是以分组的形式显示查询的结果,其语法如下所示。
from c in customs group c.name by c.city
group和by关键字结合使用,上述代码表示,按城市(city)分组显示姓名(name)。
4.order by语句
order by语句用来按顺序显示数据,主要是数据的升序和降序排列。order by的语法如下所示。
from c in customs order by c.name select new{c.name,c.phone}
其中默认的是升序,需要降序,使用关键字“desc”,如果是要第二个排序字段降序,则使用下面的语法形式。
from c in customs order by c.name,c.phone desc select new{c.name,c.city}
5.into语句
into语句会产生一个新的表,表示将此表的查询结果生成到另外一个表中,其使用语法如下所示。
from c in customs group c by c.city into n select new{country=n.key,custcount=n.group.count()}
0.5 编码规范
在编写程序时,好的编码规范非常重要,一方面可以便于后期的程序维护和管理,另一方面,具有良好规范的编码可以大大降低开发时程序员犯错误的几率。
0.5.1 好的编码结构
对比下面两段代码,它们的功能相同,都定义了一个矩形类,并包含求面积的方法。
1.第一段代码
1. public class Rectangle 2. { 3. public double dblWidth; 4. public double dblHeitht; 5. 6. public Rectangle(double_dblWidth,double_dblHeight) 7. { 8. this.dblWidth=_dblWidth; 9. this.dblHeitht=_dblHeight; 10. } 11. 12. public double GetArea() 13. { 14. return this.dblHeitht*this.dblWidth; 15. } 16. }
2.第二段代码
1. public class Rectangle{ 2. public double dblWidth; 3. public double dblHeitht; 4. public Rectangle(double_dblWidth,double_dblHeight){ 5. this.dblWidth=_dblWidth; 6. this.dblHeitht=_dblHeight; 7. } 8. public double GetArea(){ 9. return this.dblHeitht*this.dblWidth; 10. } 11. }
相信在不作任何解释的情况下,读者还是能够看明白代码A的内容,因为它缩进结构良好,体现了清晰的逻辑结构。而代码B呢?恐怕就困难多了。
可以看出,良好的代码层次结构及清晰的代码逻辑结构,可以大大提高代码的质量。一方面可以降低程序员出错的可能性,另一方面,在代码出现错误的时候也很容易查找。
0.5.2 好的注释风格
注释可以大大提高代码的可阅读性,另外在编写程序时,还可以帮助程序员具有更清晰的思路。同样,仔细研究下面的两个代码段。
1. ///<summary> 2. /// 接口:形状 3. ///</summary> 4. public interface IShape 5. { 6. ///<summary> 7. /// 方法:求面积 8. ///</summary> 9. ///<returns></returns> 10. double GetArea(); 11. } 12. 13. ///<summary> 14. /// 矩形类 15. ///</summary> 16. public class Rectangle:IShape 17. { 18. public double dblWidth; //宽 19. public double dblHeitht; //高 20. 21. ///<summary> 22. /// 构造函数 23. ///</summary> 24. ///<param name="_dblWidth">宽</param> 25. ///<param name="_dblHeight">高</param> 26. public Rectangle(double_dblWidth,double_dblHeight) 27. { 28. this.dblWidth=_dblWidth; 29. this.dblHeitht=_dblHeight; 30. } 31. 32. ///<summary> 33. /// 求矩形面积 34. ///</summary> 35. ///<returns>面积</returns> 36. public double GetArea() 37. { 38. return this.dblHeitht*this.dblWidth; 39. } 40. }
很明显,有了注释之后,完全没有必要对这段代码进行解释了,读者一定能够看懂。另外,VS.NET提供了良好的自动注释功能,在方法或者类前面用“///”添加注释时,会自动生成大量的注释格式,只需要在相应的位置添入注释项即可。
在此推荐尽量使用“///”对类或方法进行注释,这样做还有另外一个好处,当引用这个类或者方法时,VS.NET会自动提示注释的内容。如图0.23所示的是在引用Rectangle类的构造函数时的情况。
图0.23 根据方法注释给出提示
这样,在调用方法时便可以更加方便。
0.5.3 好的命名规范
在C#编码中,常常使用到的命名规范有:
○ Pascal大小写规范:所有单词第一个字母大写,其他字母小写。
○ Camel大小写形式:除了第一个单词,所有单词第一个字母大写,其他字母小写。
在C#中,推荐的命名规范如下:
(1)类名使用Pascal大小写形式,如:
1. public class HelloWorld 2. { 3. … 4. }
(2)方法使用Pascal大小写形式,如:
1. public class HelloWorld 2. { 3. void SayHello(string name) 4. { 5. … 6. } 7. }
(3)变量和方法参数使用Camel大小写形式,如:
1. public class HelloWorld 2. { 3. int totalCount=0; 4. void SayHello(string name) 5. { 6. string fullMessage="Hello"+name; 7. … 8. } 9. }
也可以加前缀以表示变量的类型,但实际上C#并不推荐这种方式。
0.5.4 避免文件过大
在开发中,应尽量避免使用大文件。如果一个文件里的代码超过300~400行,就可以考虑将代码分开到不同的类中;如无法避免,则可以考虑定义partial类。另外,也要尽量避免写太长的方法,一个较理想的方法代码在1~25行之间,方法名应尽量体现其功能。比较下面两段代码:
(1)一个好的类,功能独立的方法尽量分开。
1. /// 矩形类 2. public class Rectangle:IShape 3. { 4. public double dblWidth; //宽 5. public double dblHeitht; //高 6. 7. /// 求矩形面积 8. public double GetArea() 9. { 10. return this.dblHeitht*this.dblWidth; 11. } 12. 13. /// 求周长 14. public double GetRoundLength() 15. { 16. return this.dblHeith+this.dblWidth; 17. } 18. }
(2)不好的类:
1. /// 矩形类 2. public class Rectangle:IShape 3. { 4. public double dblWidth; //宽 5. public double dblHeitht; //高 6. 7. /// 求矩形面积和周长 8. public double GetData(ref double_dblArea,ref double_dblRoundLengh) 9. { 10. _dblArea=this.dblHeitht*this.dblWidth; 11. _dblRoundLengh=this.dblHeitht+this.dblWidth; 12. } 13. }
第二段代码把多个功能融合在一个方法里,一方面逻辑比较混乱,另一方面也容易使方法变得非常大,不易管理。
承上启下
■ 学完本章后,读者需要回答:
1.用户在浏览网页时,页面文件经历了怎样的过程才呈现在用户眼前?
2.静态网页和动态网页有何区别?
3.了解Java、JavaScript、CSS,以及Flash吗?
4.能否独立完成最简单的一个ASP.NET程序,在页面上显示几行字?
5.C#是什么?有哪些数据类型?
6.如何定义C#合法的变量和常量?
7.C#中的运算符有哪些?了解它们的优先级别吗?
8.能够使用流程控制语句组织代码吗?
9.如何从编码结构、注释风格、命名规范,以及控制文件大小方面,写出高质量的代码?
■ 在下一章中,读者将会了解:
1.动态网页的运行机制。
2.ASP.NET的功能和特点。
3.ASPX页面的构成。
4.将C#代码嵌入HTML中的方法,以及ASP.NET将HTML和C#代码分离的机制。
5.利用服务器控件的事件对ASPX页面作出动态响应。
6.利用ASPX页面的Page Load事件在页面加载时执行命令。