C#从入门到精通(第2版)
上QQ阅读APP看书,第一时间看更新

第2章 C#编程入门

本章视频教学录像:39分钟

通过第1章的学习,我们对C#语言和它的开发环境Visual Studio 2013有了一定的了解,在本章中我们将给大家介绍怎样编写第一个C#控制台应用程序、Windows窗体应用程序及怎么使用MSDN和网络的帮助。

本章要点(已掌握的在方框中打钩)

□ 创建第1个控制台应用程序

□ 创建第1个Windows窗体应用程序

□ 学会使用MSDN和网络

2.1 创建第1个C#程序

本节视频教学录像:19分钟

通过前面的介绍,我们已经对Visual Studio 2013的强大功能有了初步的认识。本节利用Visual Studio 2013创建和编译第1个C# 应用程序,带领大家进入C#编程世界。

2.1.1 创建第1个控制台应用程序

【范例2-1】 使用Visual Studio 2013创建第1个控制台应用程序。

⑴ 单击【开始】 【程序】 【Microsoft Visual Studio 2013】【Microsoft Visual Studio 2013】命令,启动Visual Studio 2013。如果是第1次使用Visual Studio 2013,会提示用什么语言编写程序,选择C#即可。在Visual Studio 2013窗口中选择【新建】【项目】,在弹出的【新建项目】窗口中的【模板】中选择【Visual C#】,然后选择【控制台应用程序】,在【名称】文本框中输入项目名称“HelloCSharp”,并选择项目保存的【位置】(如D:\用户目录\documents\visual studio 2013\Projects)。

⑵ 单击【确定】按钮,直接打开“Program.cs”的代码窗口,并且会自动产生如下的代码。

    01  using System;
    02  using System.Collections.Generic;
    03  using System.Linq;
    04  using System.Text;
    05  using System.Threading.Tasks;
    06  namespace HelloCSharp
    07  {
    08         class Program
    09         {
    10                static void Main(string[]args)
    11                {
    12                }
    13         }
    14  }

⑶ 在Program.cs中的Main方法中输入以下代码(代码1-1.txt),如下图所示。

    01  Console.WriteLine("Hello C#4.5");
    02  Console.ReadKey();

技巧

C#是一种对大小写特别敏感的编程语言,在拼写Main时,首字母必须大写。另外,程序中的Main函数必须为static类型。

⑷ 选择【生成】【生成解决方案】菜单命令,开始编译,如没有编译错误,输出窗口将显示生成成功的字样;如有错误,错误将在错误窗口中列出。

【代码详解】

Program.cs中的第1~5行代码是导入的命名空间,这是创建控制台应用程序时自动生成的,不用管它,最好不要动。第6行中namespace的后面是本项目命名空间,默认和项目名称一样。系统自动生成一个包含Main方法的Program类,自己想运行的代码一般都写在Main方法中。第12行代码是用户自己输入的,能在控制台输出“Hello C# 4.5”。第13行代码表示等待用户输入任意键。

【运行结果】

选择【调试】【启动调试】菜单命令或单击按钮,即可在控制台中输出结果,如下图所示。

提示

运行此程序时,这个控制台窗口会一闪而过。如果按【Ctrl+F5】组合键不调试直接运行,窗口就会停住。添加Console.ReadKey()或Console.Read()语句可以使运行暂停,按任意键继续,这样就能看清楚运行结果了。

【范例分析】

在这个程序中为什么会输出“Hello C# 4.5”呢?全靠步骤⑶中的Console.WriteLine方法。该方法是CLR库中“Console”类的输出方法之一,这个类就包含在命名空间System中,所以说系统自动生成的代码也是不可或缺的,如果去掉了“using System;”这行代码,就会提示当前上下文中不存在名称“Console”。另一方面,自动生成可以省去很多操作。

从这个程序中可以看出C#程序的以下几个典型特点。

⑴ 可以使用系统内的命名空间,如“using System;”,也可以自定义命名空间,如“namespace HelloWorld”。

⑵ 方法的定义,如第10行代码定义的是Main方法,程序是从这里开始执行的。

⑶ 类的声明,如“class Program”,声明以后就可以直接调用了。

在解决方案资源管理器中可以看到控制台应用程序的组成如下。

.AssemblyInfo.cs文件:存放程序集信息的文件。

.Program.cs文件:提供控制台应用程序运行入口的类文件,可以编写程序要执行的代码。

.引用:表示项目中用到的命名空间或组件,该项目中引用的都是系统自动提供的,也可以手动添加引用。

【拓展训练】

在控制台输出中文信息“你好,欢迎来到C# 4.5的世界!”。

既然能输出“Hello C# 4.5”,那么想输出“你好,欢迎来到C# 4.5的世界!”怎么办呢?只需要将步骤⑶的关键语句中的引号里面的内容改为你想要输出的内容即可(拓展代码1-1.txt)。

System.Console.WriteLine("你好,欢迎来到C#4.5的世界!");

提示

引号和括号需要使用英文形式的,Console前面的System.可以省略,因为使用了using System,否则不能省略。

运行后的输出如下图所示。

2.1.2 创建第1个Windows窗体应用程序

【范例2-2】 使用Visual Studio 2013创建第1个Windows应用程序。

⑴ 启动Visual Studio 2013,在Visual Studio 2013窗口中选择【新建】【项目】,弹出【新建项目】窗口,在【模板】中选择【Visual C#】,然后选择【Windows窗体应用程序】,在【名称】文本框中输入项目名称“HelloWindows”,然后单击【确定】按钮,打开一个带窗体的Windows应用程序。

⑵ 在【工具箱】窗口中可以把所需的控件添加到窗体上来进行界面设计(双击工具箱中的控件或直接把控件从工具箱拖放到窗体上),如分别添加一个文本框Textbox控件和一个按钮Button控件,如下图所示。

⑶ 在右下部分属性设置里面,设置按钮Button1的Text属性为“单击我”。

⑷ 双击窗体上的Button1按钮,自动打开代码视图窗口并生成button1_Click方法,然后添加代码如下(代码1-2.txt)。

    textBox1.Text = "Hello,C# 4.5"; //设置textBox1的text属性

完整的代码如下。

    01  using System;
    02  using System.Collections.Generic;
    03  using System.ComponentModel;
    04  using System.Data;
    05  using System.Drawing;
    06  using System.Linq;
    07  using System.Text;
    08  using System.Windows.Forms;
    09
    10  namespace HelloWindows
    11  {
    12    public partial class Form1:Form
    13    {
    14        public Form1()
    15      {
    16          InitializeComponent();
    17      }
    18
    19      private void button1_Click(object sender,EventArgs e)
    20      {
    21         textBox1.Text="Hello,C#4.5";//设置textBox1的text属性
    22      }
    23    }
    24  }

【代码详解】

Windows窗体应用程序生成的窗体名默认为Form1.cs,Form1.cs中的1~8行是导入的命名空间,这是创建Windows窗体应用程序自动生成的。第10行中namespace的后面是本项目命名空间,默认和项目名称一样。第12行是Form1类的定义,第14~17行是自动生成的构造函数。第19~22行是单击按钮Button1时要执行的代码。第21行是自己输入的,用来在文本框中显示“Hello C# 4.5”信息。

【运行结果】

单击工具栏中的【启动调试】按钮,在出现的窗体中单击按钮,运行结果如下图所示。

【范例分析】

在这个Windows窗体应用程序中,代码比较简单。我们在窗体上添加TextBox和Button控件并设置其相应属性,编写按钮的单击事件处理程序方法代码“textBox1.Text = "Hello,C# 4.5";”;实现在文本框中输出信息。Windows窗体应用程序结构和控制台应用程序类似,除了有一个Form1.cs窗体文件外,也有一个Program.cs文件作为应用程序运行的主入口点。自动生成的代码如下。

    01 using System;
    02 using System.Collections.Generic;
    03 using System.Linq;
    04 using System.Windows.Forms;
    05
    06 namespace HelloWindows
    07 {
    08   static class Program
    09   {
    10     ///<summary>
    11     ///应用程序的主入口点
    12     ///</summary>
    13     [STAThread]
    14     static void Main()
    15     {
    16       Application.EnableVisualStyles();
    17       Application.SetCompatibleTextRenderingDefault(false);
    18       Application.Run(new Form1());
    19     }
    20   }
    21 }

【拓展训练】 使用Visual Studio 2013创建第1个网站。

⑴ 启动Visual Studio 2013,选择【新建】【网站】,在弹出窗口中的【项目类型】中选择【Visual C#】,在【模板】中选择【ASP.NET Web窗体网站】,在【Web位置】后面输入网站名称“FirstWebSite”,【语言】选择“C#”,然后单击【确定】按钮,打开一个带Web窗体的网站项目。

⑵ 切换到自动生成的Default.aspx页面的设计视图,在Default.aspx页面上双击自动出现代码视图窗体,并生成Page_Load方法框架。在Page_Load方法中输入以下代码。

    Response.Write("Hello C# 4.5"); //

完整代码如下。

    01 using System;
    02 using System.Configuration;
    03 using System.Data;
    04 using System.Linq;
    05 using System.Web;
    06 using System.Web.Security;
    07 using System.Web.UI;
    08 using System.Web.UI.HtmlControls;
    09 using System.Web.UI.WebControls;
    10 using System.Web.UI.WebControls.WebParts;
    11 using System.Xml.Linq;
    12
    13 public partial class_Default:System.Web.UI.Page
    14 {
    15   protected void Page_Load(object sender,EventArgs e)
    16     {
    17        Response.Write("Hello C#4.5");//在页面上显示"Hello C#4.5"
    18     }
    19 }

Response.Write将信息输出到Web页面中,运行后的输出如下图所示。

2.2 使用帮助

本节视频教学录像:3分钟

在学习的过程中难免会遇到困难,如果遇到困难时,能解决问题的老师和朋友不在身边该怎么办?通过MSDN和互联网我们可以找到答案。

2.2.1 使用MSDN

MSDN是开发人员必备的开发文档,安装Visual Studio 2013之后单击菜单栏中的【帮助】【添加和移除帮助内容】。在【添加和移除内容】中的搜索栏中输入Visual C#,搜索和Visual相关的帮助文档,然后在所搜索到的可用文档中单击【添加】,最后单击右下角的【更新】,等更新完成,相关内容就添加到了我们本地的电脑中。

MSDN的使用很简单,常用的使用方式有以下4种。

目录:以大纲的方式显示帮助信息,比如可以按照“Visual C#入门”主题学习C#。

索引:以关键字的方式显示帮助信息。

收藏夹:可以收藏某个主题的帮助文档。

除此之外,使用MSDN的搜索功能,可以按照关键字搜索帮助文档。假如用目录和索引方式没有找到需要的知识,还可以利用搜索功能来查找。可以同时搜索本地MSDN和网上社区,从而找到更多关于搜索关键字的文章。为了使搜索更准确,在搜索界面还可以设置需要搜索的编程语言和技术主题,从而缩小搜索的范围,以使搜索更精确。

2.2.2 学会利用网络解决问题

网络是个巨大的知识库,也是很好的老师,一个初学者遇到的问题,别人也许早就遇到了,网络中一般会有相应的解决方法。一定要学会利用Google、Baidu等搜索引擎去搜索,到专业的网站或论坛上也能找到自己所需的资料,如CSDN网站等。

2.3 C#开发的一般过程

本节视频教学录像:7分钟

C#语言开发的一般过程和很多面向对象语言的开发过程一样,主要有以下5个步骤。

1. 需求获取分析

相关系统分析员和用户初步了解需求,然后用Word列出要开发的系统的大功能模块,每个大功能模块有哪些小功能模块,对于有些需求比较明确相关的界面,在这一步里面可以初步定义好少量的界面。

系统分析员深入了解和分析需求,根据自己的经验和需求用Word或相关的工具再做出一份文档系统的功能需求文档。这次的文档会清楚列出系统大致的大功能模块,大功能模块有哪些小功能模块,并且还列出相关的界面功能。

2.设计

软件设计可以分为概要设计和详细设计两个阶段。实际上软件设计的主要任务就是将软件分解成模块,即能实现某个功能的数据和程序说明、可执行程序的程序单元,可以是一个函数、过程、子程序、一段带有程序说明的独立的程序和数据,也可以是可组合、可分解和可更换的功能单元。然后进行模块设计。概要设计就是结构设计,其主要目标就是给出软件的模块结构,用软件结构图表示。详细设计的首要任务就是设计模块的程序流程、算法和数据结构,次要任务就是设计数据库,常用方法还是结构化程序设计方法。

3.编码

在软件编码阶段,开发者根据需求分析中对数据结构、算法分析和模块实现等方面的设计要求,开始具体的编写程序工作,分别实现各模块的功能,从而实现对目标系统的功能、性能、接口、界面等方面的要求。

4.测试

软件测试的目的是以较小的代价发现尽可能多的错误。实现这个目标的关键在于设计一套出色的测试用例(测试数据和预期的输出结果组成了测试用例)。不同的测试方法有不同的测试用例设计方法。测试用例设计的关键是以较少的用例覆盖尽可能多的内部程序逻辑结果。

5.软件交付

在软件测试证明软件达到要求后,软件开发者应向用户提交开发的目标安装程序、数据库的数据字典、用户安装手册、需求报告、设计报告、测试报告等。用户安装手册应详细介绍安装软件对运行环境的要求,安装软件的定义和内容,在客户端、服务器端及中间件的具体安装步骤,安装后的系统配置。

2.4 程序编写规范

本节视频教学录像:10分钟

为了保证编写出的程序都符合相同的规范,保证一致性、统一性而创建的程序编码规范。编码规范对于程序员而言尤为重要,主要原因有以下几个。

⑴ 一个软件的生命周期中,80%的花费在于维护。

⑵ 几乎没有任何一个软件,在其整个生命周期中,均由最初的开发人员来维护。

⑶ 编码规范可以改善软件的可读性,可以让程序员尽快而彻底地理解新的代码。每个软件开发人员都必须遵守统一的编码规范。

⑷ 代码尽量简单直白。

2.4.1 命名规范

1. 说明

表达清晰的命名规范是程序规划的核心,如果规范的命名能清晰地表达出相应的功能,就可以让人“望文知意”,提高开发效率和系统的可维护性。反之,如果命名不能表达其含义,例如,“aaa”、“bbb ()”,那么将事倍功半。

2. Pascal风格

包含一到多个单词,每一个单词第一个字母大写,其余字母均小写。例如,HelloWorld、SetName等。

3. Camel风格

包含一到多个单词,第一个单词首字母小写,其余单词首字母大写。例如,name、productId等。

2.4.2 标识符的大小写规则

⑴ 除了参数与变量外,所有命名空间名称、类、函数、接口、属性等名称的命名,使用Pascal风格。

⑵ 参数与变量的命名使用Camel风格。

2.4.3 通用命名约定

约定的是如何选择最适当的名称,这些准则适用于所有标识符的命名。

1. 选择名称

⑴ 请选择易读的英文名称。例如,英文Order的意思为规则、次序、订购等,如果用在排序列中就不是很合适,用来表示订单则更具可读性。可读性比详细描述更重要,比如表示坐标名称的ScreenX就比ScreenHorizontally更具可读性。

⑵ 除下画线外,不要使用连字符或任何其他非字母数字字符。在数据库表字段名称设计时,与其他表字段有关联时,适当地使用表名+下横线+字段名,可以更清晰地表现出该字段与关联表对应字段的关系。比如产品分类表ProductClass中有字段Id与Name,那么产品表绑定的这两个字段可命名为ProductClass_Id与ProductClass_Name,这样在查看产品表时就可以清晰地知道这两个字段与分类表的关系。

⑶ 避免使用与常用编程语言的关键字冲突的标识符。

⑷ 变量和方法参数使用Camel风格。例如,

    01 string productName="";
    02 int number=0;
    03 string sqlString="";
    04 double averageScore=0.0;
    05 Users users=newUsers();
    06 Users model=newUsers();
    07 Users userModel=newUsers();
    08 const string const_String="";
    09   Private stringGetProductName(int id)
    10 {
    11     return"";
    12 }

⑸ 不要使用成员属性作为成员变量的前缀(其他变量命名也一样)。例如,不要像Users m_users;这样定义成员变量,可以使用第⑷点的设置。

2. 字母缩写词

⑴ 通常不要使用缩写。

⑵ 除非这种缩写已被广泛接受,或者团队当中大家都认可一种缩写。例如,使用OnButtonClick,如果团队中普遍认可OnBtnClick这种写法也是可以的。

2.4.4 命名空间命名

命名空间的命名采用Pascal风格,取名的一般规则为Zhangsan. ProjectName(人名.项目名称),例如,Zhangsan.Office;需要用复数时,请使用复数,例如,使用System.Collections而不是System. Collection;需要缩写时,不需要加复数,例如,使用System.IO而不是System.IOs。

2.4.5 类、结构和接口命名

⑴ 按照Pascal大小写格式,使用名词或名词短语为类、接口和值类型命名。

⑵ 接口命名以字母I为前缀,例如,Icomponent。

⑶ 派生类的末尾使用基类名称。例如,从Stream继承的Framework类型以Stream结尾,从Exception继承的类型以Exception结尾。

2.4.6 逻辑层类命名

按照Pascal大小写格式,使用名词或名词短语命名,并加上后缀Logic。

2.4.7 文件夹命名

文件夹以功能模块名称,按照Pascal大小写格式命名。比如后端管理功能及权限相关功能,全部放到Systems文件夹里。

2.4.8 代码编码规范

⑴ 缩进和间隔。缩进用【Tab】键,不用【Spaces】键。

⑵ 注释需和代码对齐。多使用#regedit和#endregion代码块。

⑶ 在代码中垂直对齐左括号和右括号。

    01  if(x==0)
    02  {
    03  Response.Write("");
    04  }

不要出现以下情况。

    01  if(x==0){
    02  Response.Write("");
    03  }

或者:

    if(x == 0){ Response.Write(" "); }

⑷ 适当地增加空行,来增加代码的可读性。

在下列情况下应该有两行空行。

① 同一文件的不同部分之间。

② 在类、接口及彼此之间。

在下列情况下应该有一行空行。

① 方法之间。

②局部变量和它后边的语句之间。

③ 方法内的功能逻辑部分之间。

⑸ 避免使用大文件。如果一个文件里的代码超过300~400行,必须考虑将代码分开到不同类中。当然,模板生成类与逻辑层类除外。

⑹ 避免写太长的方法。一个典型的方法代码在1~25行之间。如果一个方法代码超过25行,应该考虑将其分解为不同的方法。

⑺ 为了防止在阅读代码时不得不滚动源代码编辑器,每行代码或注释在1024×768的显示频率下不得超过一显示屏。

⑻ 在大多数运算符之前和之后使用空格,这样做不会改变代码的意图,却可以使代码容易阅读。

例如,

    int j = i + k;

而不应写为:

    int j=i+k;

括号和它里面的字符之间不应该出现空格,括号应该和它前面的关键词留有空格。例如,

    01  while(true)
    02  {
    03
    04  };

但是方法名和左括号之间不应该有空格,参数之间的逗号后应该加一个空格。例如,

    method1(int i1, int i2)

for语句里的表达式之间加一个空格。例如,

    for(expr1; expr2; expr3)

强制类型转换时,在类型和变量之间加一个空格。例如,

    (int) i ;

⑼ 所有可供用户输入的字段值,必须忽略前后空白(不包含密码);在对字段值进行有效性验证时,对提交进数据库的内容必须进行SQL注入过滤与XSS过滤。

⑽ 一个方法只完成一个任务。不要把多个任务组合到一个方法中,即使那些任务非常小。

⑾ 避免使用很多成员变量,声明局部变量,并传递给方法。

⑿ 不要在方法间共享成员变量,如果在几个方法间共享一个成员变量,那就很难知道是哪个方法在什么时候修改了它的值。

⒀ 不在代码中使用具体的路径和驱动器名,使用相对路径,并使路径可编程。永远别设想你的代码是在“C:”盘运行。你不会知道,一些用户在网络或“Z:”盘运行程序。

⒁ 应用程序启动时进行“自检”并确保所需文件和附件在指定的位置。

如果需要的配置文件找不到,应用程序需自己创建使用默认值的一份。如果在配置文件中发现错误值,应用程序要抛出错误,给出提示消息告诉用户正确值。

⒂ 出现任何问题给用户一个友好的提示,错误消息需能帮助用户解决问题。

永远别用像“应用程序出错”、“发现一个错误”等之类的错误消息,而应给出像“更新数据库失败,请确保登录ID和密码正确” 的具体消息。显示错误消息时,除了说哪里错了,还应提示用户如何解决问题。不要用像“更新数据库失败”这样的,要提示用户怎么做,比如“更新数据库失败,请确保登录ID和密码正确”。

⒃ 错误处理和异常事件。

不要“捕捉了异常却什么也不做”。如果隐藏了一个异常,你将永远不知道异常到底发生了没有。

发生异常时,给用户提示友好的消息,但要精确记录错误的所有可能细节,包括发生的时间和相关方法、类名等。

别写太大的try-catch模块。如果需要,为每个执行的任务编写单独的try-catch模块。这将很容易找出哪一段代码产生异常,并给用户发出特定的错误消息。

如果应用程序需要,可以编写自己的异常类。自定义异常不应从基类SystemException派生,而要继承于. IApplicationException。

2.5 高手点拨

本节视频教学录像:2分钟

什么是Windows窗体应用程序和控制台应用程序,各自有什么特点?

控制台程序是指类似DOS窗口那样,以console命令行方式运行的程序,操作系统都支持控制台程序,当然也包括Windows、Linux系统等。

控制台应用程序一般没有独立的窗口,输入和输出都是以标准I/O进行的,不像一般的客户端程序能使用鼠标操作。用户可以不用跟客户机进行交互,而且通常只运行在后台。

窗体是指程序与用户交互的可视界面,简单地说Windows窗体应用程序就是我们通常用到的各种客户端程序,可显示信息、请求用户输入及通过网络与远程服务器进行通信。有很好的人机交互界面,都是基于普通的C/S架构的程序。

两者的区别,简单一点地说就是,如果要对控制台应用程序进行操作,需要从命令行输入命令和参数,像DOS系统那样,Windows窗体应用程序就是拥有良好的人机交互界面,可显示信息、请求用户输入信息,使用起来简单方便。

2.6 实战练习

操作题

用C#分别编写一个控制台应用程序、一个窗体应用程序和一个ASP.ent网站,实现输出“我爱C#程序设计语言!”的效果。