使用 Microsoft Visual C# 2005 Express Edition 编程简介
Andrew W. Troelsen
Intertech Training
摘要:本文介绍了如何以使用 Microsoft Visual C# 2005 Express Edition 集成开发环境 (IDE) 的 C# 语言进行编程。本文通过各种示例项目,为读者介绍了 C# 编程语言的几个方面和 .NET 平台的主要概念。
注 本文假定读者是有兴趣探究使用 Visual C# 2005 Express Edition 的 C# 语言和 .NET 平台的业余爱好者、学生或有编程思想的个人。不要求您之前一定接触过 C#,但以前的一些编程经验将有所帮助。
适用于:
Microsoft Visual C# 2005 Express Edition
本页内容
什么是 Visual C# 2005 Express Edition?
.NET 应用程序可以使用多种方法创建。顽固的开发人员可以采用突击方法,使用精简的文本编辑器(例如,notepad.exe)和 C# 命令行编译器 (csc.exe) 来构建 .NET 程序。虽然 .NET 软件开发工具包 (SDK) 可以从 Microsoft 站点 (www.microsoft.com/net) 免费下载,但这种方法会带来许多麻烦,因为它在 SDK 中不提供代码生成实用工具(向导)、图形调试器和 IntelliSense 功能。
为了帮助减轻在命令行构建软件的负担,许多 .NET 开发人员都利用可视化工具,例如,Microsoft 功能齐全的 IDE 和 Visual Studio .NET 2003 (http://msdn.microsoft.com/vstudio)。虽然此产品的功能非常强大,但对于 .NET 业余爱好者和/或大学生来说,企业版的价格过高。老实说,除非您是专业的软件工程师,否则 Visual Studio .NET 2003 所提供的大量选项通常会使您的学习过程复杂化,而不会提供任何帮助。
介于 notepad.exe 和 Visual Studio .NET 2003 软件功能之间的就是 Microsoft 的最新 IDE,即 Visual C# 2005 Express Edition。在撰写本文时,测试版的 Visual C# 2005 Express Edition 已经通过 Web 下载 (http://msdn.microsoft.com/express) 免费提供。由于 Visual C# 2005 Express 的大小相对较小,因此即使是使用 56K 调制解调器连接,也可以轻松获得它。
Visual C# 2005 Express 实际上是 Express 家族的几个成员之一。具体来说,Microsoft 提供了下列 Express Edition 产品:
• |
Visual Web Developer 2005 Express:一个使用 ASP.NET 构建动态 Web 站点和 XML Web 服务的轻型工具。 |
• |
Visual Basic 2005 Express:一个供初级程序员学习如何构建 Windows 应用程序的理想的简化编程工具。 |
• |
Visual C# 2005 Express、Visual C++ 2005 Express 和 Visual J# 2005 Express:针对希望学习计算机科学基本知识的学生和热衷者的目标编程工具。 |
• |
SQL Server 2005 Express:一个适用于业余爱好者、热衷者和学生开发人员的入门级数据库管理系统。 |
简单地说,Express Edition 产品系列是业余爱好者、学生和新手了解 .NET 平台的理想入门工具。如果您属于其中一员,请下载并安装 Visual C# 2005 Express,然后继续阅读此文。
Visual C# 2005 Express 的高级功能
Visual C# 2005 Express 提供了许多您在 .NET 开发环境中需要的关键功能,例如:
• |
与 ANSI 兼容的 C# 2.0 编译器 |
• |
功能齐全的集成调试器 |
• |
高级 IntelliSense 功能 |
• |
针对 Windows 窗体开发的设计时支持 |
• |
支持本地数据库访问 |
• |
十分轻松地访问 XML Web 服务 |
您还需要了解 Visual C# 2005 Express 不支持的功能。具体来说,Visual C# 2005 Express 不直接支持以下功能:
• |
ASP.NET Web 应用程序 |
• |
XML Web 服务的结构 |
• |
移动应用程序开发(手机、PDA、Windows CE 设备) |
• |
远程数据库连接工具 |
在下文中,我们将为您介绍使用 Visual C# 2005 Express 的 C# 和 .NET 平台。但是请注意,本文不是 有关 C# 编程语言、.NET 平台或 Visual C# 2005 Express IDE 的综合教程。本文结尾处提供了指向 .NET Web 站点的其他链接,以进一步强化您的学习过程。
Visual C# 2005 Express 项目
Visual C# 2005 Express 项目由任意数量的 C# 源代码文件(使用 *.cs 文件扩展名)组成,它支持内容文件(XML 文档、应用程序图标和图像等)和引用的程序集(在本文后面详细说明)。Visual C# 2005 Express 提供了许多核心项目类型(在下表中有描述),而不是强制我们为特定类型的项目(Windows 窗体应用程序、控制台应用程序等)创建相同的公式化代码。
Visual C# 2005 Express 项目类型 | 定义 |
Windows 应用程序 |
创建新的 Windows 窗体项目。 此类项目用于创建诸如 Microsoft Word 之类的桌面应用程序。 |
类库 |
此项目用于创建可重复使用的代码库(打包为 *.dll 文件),该代码库可以跨您的 .NET 应用程序使用。 |
控制台应用程序 |
此项目可以创建基于控制台的应用程序。 在学习新的编程语言(例如,C#)时,这些应用程序非常有用,因为您不需要考虑图形用户界面 (GUI) 的结构。 |
空项目 |
该选项可以生成没有初始 C# 代码文件的项目。在您希望使用 Project | Add Existing Item 菜单项将现有文件导入新项目时,该选项十分有用。 |
为了开始研究 C#,我们将创建一个名为 MyCSharpExpressApp 的全新控制台应用程序。File | New | Project 菜单选择可以激活一个新的项目对话框,如图 1 所示。
图 1. 创建新的控制台应用程序项目
此时,您可能希望使用 File | Save All 菜单选择进行保存。在得到的对话框中,指定您选择的位置,如图 2 所示。
图 2. 保存当前项目
注 第一个控制台应用程序将不会提供很多功能,它只是作为一个检查某些基本概念的工具。在本文后面,我们将构建一个完整(且更有趣)的应用程序。
程序集、命名空间和类型
在我们深入研究第一个示例之前,需要了解 .NET 编程方面的一些关键术语。在我为软件专业人员授课的几年中,我可以肯定地说,程序集、命名空间 和类型 之间的区别总是让新的 .NET 开发人员感到迷惑不解。我们尽量不让这发生在您身上。
当您构建项目时,您实际上就是在创建 .NET 程序集。从形式上说,程序集就是一个物理文件(其文件扩展名通常是 *.exe 或 *.dll),您可以使用 Windows Explorer 在硬盘驱动器上直接查看此文件。
Visual C# 2005 Express 解决方案浏览器窗口将显示一个名为 References 的子文件夹,它列出了当前项目所使用的程序集的集合。但是,不同的项目需要引用一组唯一的程序集,图 3 显示了当前控制台应用程序的程序集。
图 3. 控制台应用程序项目引用的程序集
随着构建越来越精细的 .NET 应用程序,您通常需要使用特定项目所包含的集合以外的程序集。为此,C# Express 提供了“添加引用”对话框,它可以使用 Project | Add Reference 对话框激活。此时,您不必添加其他程序集。图 4 显示了上述对话框。
图 4. C# Express 的“添加引用”对话框
程序集包含一组命名空间。简单地说,命名空间就是一个在语义上相关的类型 的集合。您要知道,单个程序集通常会包含多个命名空间。例如,mscorlib.dll 程序集就包含文件输入和输出 (System.IO)、集合类型 (System.Collections)、通用实用工具类型 (System) 等等的命名空间。
注 每个 .NET 应用程序都会自动引用 mscorlib.dll,因此您无需手动引用该核心库。
命名空间可以定义任意数量的类型。对于 .NET 2.0,下表简要(关键字为简要)描述了 5 种类型。
.NET 类型 | 基本含义 |
Class |
类是一个对象的设计图。与房屋的设计图一样,类可用于创建对象。与房屋一样,每个独立对象的属性可以完全不同(例如,蓝房子与红房子),但设计图将不会改变。 |
Interface |
接口可以定义类或接口支持的一组公共方法。接口使您能够定义类或结构必须支持的一组成员。 |
Structure |
简单地说,结构是轻型的类类型。在建模数学、几何或其他原子数据时,这种类型十分理想。结构缺少类的面向对象的功能,例如,继承。 |
Enumeration |
枚举(英文简写为 enums)是名称/值对的已命名集合。枚举使您能够定义程序中使用的已知值。 |
Delegate |
委托归结为类型安全的函数指针。这些类型是 .NET 事件体系结构的基础。无论您是处理按钮的 Click 事件,还是处理 ASP.NET Web 页的回发,委托都是基础结构。 |
当某个 C# 项目需要使用给定程序集中的类型时,第一步就是使用 Add Reference dialog 来引用 *.dll,如图 4 所示。第二步是在该文件的开头添加 using 指令,以指定您要访问的命名空间。实际上,C# 的 using 指令只是一个用于在代码中指定较长命名空间的缩写,它使我们能够在代码中只使用 File 来代替全名 System.IO.File。为了进行证明,您可以假定以下代码:
using System; namespace SomeProgram { class Program { static void Main(string[] args) { // Create an ArrayList and Hashtable // (the hard way). System.Collections.ArrayList a = new System.Collections.ArrayList(); System.Collections.Hashtable h = new System.Collections.Hashtable(); } } }
在此处,我们要创建 ArrayList 和 Hashtable 类型,它们都位于 System.Collections 命名空间中。使用以下 using 指令,您可以少键入一些内容,而不必将命名空间直接置于类型前面:
using System; using System.Collections; // Add this! namespace SomeProgram { class Program { static void Main(string[] args) { // Create an ArrayList and Hashtable // (the easy way). ArrayList a = new ArrayList(); Hashtable h = new Hashtable(); } } }
正如您猜想的那样,作为一个 .NET 程序员,您的主要目的是熟悉所使用的程序集、命名空间和类型。幸运的是,C# Express 提供了一个集成的对象浏览器实用工具,该工具可以从 View | Other Windows | Object Browser 菜单项激活。使用此工具,您可以查看每个引用程序集中的命名空间和类型,如图 5 所示。
图 5. C# Express 对象浏览器
从理论到实践:使用外部类型
现在,让我们向 MyCSharpExpressApp 项目中添加一些代码。在构建需要与本地文件系统进行交互的应用程序时,您需要使用 System.IO 命名空间。通过一个示例,更新您文件的 using 指令,并在 Main() 方法中输入以下代码:
#region Using directives using System; using System.Collections.Generic; using System.Text; using System.IO; // Need this for IO types! #endregion namespace MyCSharpExpressApp { class Program { static void Main(string[] args) { // Open a file named myInfo.txt // located on the root C:\ drive. string myFileContents; myFileContents = File.ReadAll(@"C:\myInfo.txt"); // Now print it to the console. Console.WriteLine(myFileContents); Console.ReadLine(); } } }
该应用程序使用 File.ReadAll() 方法打开指定的文件,并以字符串的形式返回内容。在此例中,名为 myInfo.txt 的文件的内容将直接显示在控制台中。假定该文件是使用 notepad.exe 创建的,并且它只包含一行文本,如图 6 所示。
图 6. myInfo.txt 文件
将该文件直接保存在 C 驱动器中,然后使用 Debug | Start Without Debugging 菜单选项运行该应用程序。如果一切正常,您应该看到图 7 中显示的输出。
图 7. 您的第一个 C# Express 应用程序
注 如果该示例没有按预期方式运行,请继续阅读。下一部分说明了如何使用 Visual C# 2005 Express 调试运行时异常。
现在,假定您希望在 Windows 窗体消息框(而不是控制台)中显示此信息。为此,您需要执行下列操作:
• |
引用 System.Windows.Forms.dll 程序集。 |
• |
指定您要“使用”System.Windows.Forms 命名空间。 |
• |
将从 File.ReadAll() 返回的字符串传递给 MessageBox.Show() 方法。 |
首先,使用图 8 中显示的 Add References 对话框引用 System.Windows.Forms.dll。
图 8. 引用 System.Windows.Forms.dll 程序集
然后,按以下方法更新代码:
#region Using directives using System; using System.Collections.Generic; using System.Text; using System.IO; // Need this for IO types! using System.Windows.Forms; // Need this for MessageBox! #endregion namespace MyCSharpExpressApp { class Program { static void Main(string[] args) { // Open a file named myInfo.txt // located on the root C:\ drive. string myFileContents; myFileContents = File.ReadAll(@"C:\myInfo.txt"); // This time, place in a message box. MessageBox.Show(myFileContents); Console.ReadLine(); } } }
一旦您再次运行应用程序,就会发现显示在 Windows 窗体消息框中的文件内容与图 9 中的内容类似。
图 9. 与 MessageBox 类类型进行交互
通过 C# Express 处理异常
当前示例大胆假设了名为 myInfo.txt 的文件存在于根驱动器 C 上。如果不存在,您将收到一个运行时错误(更正式地说,是运行时异常)。Visual C# 2005 Express 可以帮助您诊断此类错误。为了进行证明,请删除(或重命名)myInfo.txt 文件,然后使用 Debug | Start 菜单选择来调试您的程序。正如您在图 10 中看到的那样,系统为您提供了大量有关当前异常的详细信息,以及用于更正该问题的建议。
图 10. 使用 Visual C# 2005 Express 调试异常
要修复当前问题,请将您的文本文件重命名为 myInfo.txt。
通过编程方式处理异常
假设直到您的应用程序运行后才发现存在外部文件,那么 C# 程序员可以使用称为结构化异常处理 的技术。您将看到,结构化异常处理会涉及到使用少量 C# 关键字(最主要的是 try 和 catch)。
当您要调用可能会返回运行时异常的方法(例如,File.ReadAll() 方法)时,应将语句包装到 try 作用域中。如果触发了一个异常,则错误将传递到相关的 catch 作用域,您可以在该作用域中适当地处理此问题。如果 try 作用域中的每个语句在执行时都没有出现错误,那么将跳过整个 catch 块。若要直接进行测试,请按以下方法更新您的当前代码:
namespace MyCSharpExpressApp { class Program { static void Main(string[] args) { // Attempt to open a file named myInfo.txt // located on the root C:\ drive. string myFileContents; try { myFileContents = File.ReadAll(@"C:\myInfo.txt"); MessageBox.Show(myFileContents); } catch(FileNotFoundException ex) { Console.WriteLine("Error: {0}", ex.Message); } Console.ReadLine(); } } }
在此处,我们使用了 FileNotFoundException 类的 Message 属性来格式化错误消息,以防止文件丢失,如图 11 所示。
图 11. 通过编程方式处理 FileNotFoundException
对该初始示例应用程序的说明到此为止。现在,您已经对基础知识有了更好的了解,下面让我们来创建一个更复杂(且更有趣)的 C# 应用程序。
创建 C# 类库项目
我们的下一个目标是构建一个名为 ManagerSpeakLib.dll 的 .NET 类库。首先,关闭当前的 MyCSharpExpressApp 项目(使用 File | Close Project),然后创建一个名为 ManagerSpeakLib 的新类库项目,如图 12 所示。请注意,如果您先前没有保存 MyCSharpExpressApp 项目,系统会显示一个“放弃”该项目的选项,以使您能够创建快速测试项目,同时避免让无用的代码搅乱您的系统。
图 12. 创建新的类库项目
这个类的角色(我们将其重命名为 ManagerSpeak)将返回随机生成的、模仿公司内部聊天的短语。使用名为 StateTheProblem() 的方法来更新 ManagerSpeak 类:
#region Using directives using System; using System.Collections.Generic; using System.Text; #endregion namespace ManagerSpeakLib { public class ManagerSpeak { public ManagerSpeak(){} // This method returns a randomly selected problem. public string StateTheProblem() { string[] possibleProblem = { "I think we really need to leverage...", "We can emerge as a dominant force if we optimize...", "To achieve an effective use of synergy we need to consider..."}; Random r = new Random(); return possibleProblem[r.Next(3)]; } } }
在此处,我们使用 System.Random 类来返回本地字符串数组中的三个语句之一。Next() 方法用于获取随机数,在此例中,是 0 与 2 之间的数(总共有三种可能:0、1、2)。
当然,每个问题都需要一个解决方案。因此,要向名为 GetSolution() 的 ManagerSpeak 类中添加另一个方法:
public class ManagerSpeak { ... // This method returns a randomly selected solution. public string GetSolution() { // String arrays with 10 segments each. string[] list1 = { "integrated", "individualized", "cooperative", "flexible", "authentic", "functional", "responsive", "alternative", "performance", "cognitive"}; string[] list2 = { "behavioral", "relevant", "criteria", "prescriptive", "perceptual", "facilitated", "modular", "diagnostic", "structured", "situational"}; string[] list3 = { "strategies", "methodologies", "assessments", "analysis", "learning", "interaction", "objectives", "concepts", "recoveries", "management"}; // Make use of a System.Random type to // obtain a random string from each array. Random r = new Random(); int a = r.Next(10); int b = r.Next(10); int c = r.Next(10); // Now create and return the statement. string newMsg = list1[a] + " " + list2[b] + " " + list3[c]; return newMsg; } }
此时,请使用 File | Save All 菜单命令保存整个项目(在您选择的文件夹中)。通过激活 Build 菜单来编译您的新代码库。此时,您应该发现新代码库位于 Bin\Release 子目录下,如图 13 所示。
图 13. ManagerSpeakLib.dll 类库
您可能知道,*.dll 程序集无法通过从 Windows Explorer 中双击它们来直接执行,而是当其他应用程序请求它们时,由运行库来加载。这样,我们的下一步就是构建使用 ManagerSpeakLib.dll 的应用程序。
构建 Windows 窗体应用程序
要使用 ManagerSpeakLib.dll 的应用程序将是一个新的 Windows 窗体项目,名为 ManagerSpeakClient(图 14)。
图 14. 构建 Windows 窗体应用程序
一旦项目被加载,您将注意到,视觉窗体设计器会自动打开,如图 15 所示。
图 15. Visual C# 2005 Express 窗体设计器
Visual C# 2005 Express 提供了大量工具,使您可以快速构建图形用户界面 (GUI)(所有界面都可以从 View 菜单访问)。例如,图 16 中显示的“工具箱”对话框显示了大量可用于构建窗体用户界面的 Windows 窗体组件。
图 16. Windows 窗体工具箱
根据相关说明,图 17 中显示的 Properties 窗口使您能够在设计时配置当前选择的小部件(窗体、按钮等)。
图 17.“属性”窗口
使用这些工具,创建一个由一个按钮和标签组成的简单用户界面,如图 18 所示。请注意,为了符合说明,我设置了标签、窗体和按钮的 Text 属性(使用 Properties 窗口)。
图 18. Manager Client 窗体
接下来,我们需要使用 Add References 对话框(再次使用 Project | Add Reference 菜单项激活)来引用 ManagerSpeakLib.dll。请注意,如果您希望引用自己的自定义 *.dll,则需要选择 Browse 选项卡,并手动导航到要使用的代码库的位置,如图 19 所示。
图 19. 引用 ManagerSpeakLib.dll 程序集
要完成我们的 Windows 窗体应用程序,请双击使用窗体设计器的按钮。这将自动处理按钮类型的 Click 事件,并生成以下代码:
private void button1_Click(object sender, EventArgs e) { }
此时,您可以随意添加代码来操作 ManagerSpeak 类。下面是完整的代码更新(请注意 ManagerSpeakLib 的 C# using 指令)。
#region Using directives using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Windows.Forms; using ManagerSpeakLib; // Need this! #endregion namespace ManagerSpeakClient { partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { // Make a manager. ManagerSpeak m = new ManagerSpeak(); // Get the problem. string currentProblem = m.StateTheProblem(); // Get the solution. string solution = m.GetSolution(); // Show the details! MessageBox.Show(string.Format("{0}\n{1}", currentProblem , solution)); } } }
现在,请运行您的 Windows 窗体应用程序,并单击按钮。您将看到随机产生的问题/解决方案,如图 20 所示,它以非常独特(通常是令人讨厌)的“管理者讲话”的语气表达。
图 20. 注意,管理者在讲话!
这包装了我们的 Windows 窗体应用程序。您可以使用 File | Save All 菜单选项随时将该项目保存在您的计算机上。
开始进行编码:Visual C# 2005 Express 起始工具包
此时,您已经创建了三个不同的 C# Express 项目(一个控制台程序、一个类库和一个 Windows 窗体应用程序)。虽然这篇介绍性的文章无法涵盖 C# 语言的所有方面(或 Visual C# 2005 Express 的完整功能),但我希望本文能够有助于您在将来更好地进行探究。
为了将本文内容汇总,我为您提供了一个起始工具包 主题。简单地说,起始工具包是一个完整的 C# 应用程序,旨在阐释大量的编程概念。此外,起始工具包还提供了完整文档、代码演练以及对扩展附加功能的建议。其中一个默认的起始工具包是 Screen Saver 起始工具包,您可以从图 21 中显示的 New Project 对话框中选择它。您可以使用 File | New | Project... 菜单选择来启动该工具包。
图 21. 选择 Screen Saver 起始工具包
一旦您选择了 Screen Saver 项目并单击 OK 按钮后,IDE 将加载该起始工具包的文档文件 (ScreenSaverStarterKit.htm),如图 22 所示。在此处,您可以了解当前项目的基本内容。
图 22. 了解 Screen Saver 起始工具包
正如您看到的那样,该起始工具包提供了每个代码文件的详细信息,以及项目设计的分步演练。您可以通过按 F5 键来运行该应用程序。如果您连接到 Internet,则能够看到显示在一组旋转背景图像顶端的 RSS(真正简单的联合)新闻头条。
小结
Visual C# 2005 Express 是新手了解 .NET 平台的理想入口点。正如您在本文中看到的那样,IDE 可以提供一组项目类型、一个图形调试器和大量 Windows 窗体设计器。虽然本文不提供完整的 IDE 介绍,但您可能更习惯于浏览活动项目。
本文的大部分内容都是在介绍 .NET 领域中的一些核心术语。现在回想一下,程序集 是包含任意数量命名空间 的二进制文件。命名空间可以定义任意数量的类型(类、接口、结构、枚举和委托)。使用这些类型,.NET 程序员可以构建各种应用程序。
希望本文能够激发您进一步了解 C# 和 .NET 平台的兴趣。如果您需要有关 C# 的其他信息,可能需要访问下列链接:
• |
Sharp New Language: C# Offers the Power of C++ and Simplicity of Visual Basic |
• | |
• |
Andrew Troelsen 是 Intertech 培训的顾问和培训师。Andrew 是很多书籍的作者,包括获奖的 C# and the .NET Platform Second Edition(Apress 出版社,2002 年)。他还为 MacTech 每月专栏的所有版面撰写文章,在该专栏中,他探讨了如何使用 SSCLI、Portible.NET 和 Mono CLI 分发软件在基于 Unix 的系统上开发 .NET。