新手学ASP.NET 3.5网络开发
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第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事件在页面加载时执行命令。