C#高级编程(第10版) C# 6 & .NET Core 1.0 (.NET开发经典名著)
上QQ阅读APP看书,第一时间看更新

2.2 用Visual Studio创建Hello, World!

第1章解释了如何使用.NET 4.6的csc编译器和.NET Core 1.0的dotnet工具编写C#程序Hello, World!。还可以使用Visual Studio 2015创建它,这是本章的内容。

注意:在第1章,Visual Studio用作代码编辑器和编译器,没有使用Visual Studio的所有其他特性。第17章介绍了Visual Studio提供的所有其他选项和特性。

2.2.1 创建解决方案

首先,在Visual Studio中创建一个解决方案文件。解决方案允许组合多个项目,打开解决方案中的所有项目。

选择File | New Project命令,然后选择Installed | Templates | Other Project Types | Visual Studio Solutions,可以创建空的解决方案。选择Blank Solution模板(如图2-1所示)。在New Project对话框中,可以定义解决方案的名称以及应该存储解决方案的目录。也可以指定解决方案是否应该添加到Git存储库中,进行源代码控制管理。

图2-1

创建解决方案后,在Solution Explorer中会看到解决方案的内容(如图2-2所示)。目前,只有一个解决方案文件,其中没有任何内容。

图2-2

2.2.2 创建新项目

现在添加一个新项目来创建Hello, World!应用程序。在Solution Explorer中右击解决方案,或者使用工具栏中的Menu按钮打开上下文菜单(如图2-2所示),选择Add|New Project命令,打开Add New对话框。也可以选择File | Add | New Project。在Add New对话框中,选择Console Application (Package)模板,来创建一个面向.NET Core的控制台应用程序。这个项目类型在Installed | Templates| Visual C# | Web的树中(如图2-3所示)。把应用程序的名称设置为HelloWorldApp。

图2-3

注意:要打开应用程序的上下文菜单,可以使用不同的选项:选择一项,右击,打开上下文菜单(如果是左撇子,就左击);或选择一项,按键盘上的菜单键(通常位于右侧Alt和Ctrl键之间)。如果键盘上没有菜单键,就按下Shift + F10。最后,如果有触摸板,就可以执行双指触摸。

Solution Explorer不再是空的。它现在显示项目和属于该项目的所有文件(如图2-4所示)。

图2-4

在第1章,项目文件由dotnet工具创建,现在在Visual Studio模板中创建。指定了两个框架.NET 4.6和.NET Core 1.0。在两个框架中,都引用了NetStandard.Library 1.0 (代码文件HelloWorldApp /project.json):

        {
          "version": "1.0.0-*",
          "description": "",
          "authors": [ "" ],
          "tags": [ "" ],
          "projectUrl": "",
          "licenseUrl": "",
          "dependencies": {
            "NETStandard.Library": "1.0.0-*"
          },
         "frameworks": {
            "net46": { },
            "netstandardapp1.5": {
              "dependencies": { },
              "imports": "dnxcore50"
            }
          },
          "runtimes": {
            "win7-x64": { },
            "win10-x64": { }
          }
        }

生成的C#源文件Program.cs在Program类中包含Main方法,Program类在HelloWorldApp名称空间中定义 (代码文件HelloWorldApp /Program.cs):

        using System;
        using System.Collections.Generic;
        using System.Linq;
        using System.Threading.Tasks;
        namespace HelloWorldApp
        {
          class Program
          {
            static void Main(string[] args)
            {
            }
          }
        }

把它改为Hello, World!应用程序。需要打开名称空间,以使用Console类的WriteLine方法,还需要调用WriteLine方法。还要修改Program类的名称空间。Program类现在在Wrox.HelloWorldApp名称空间中定义(代码文件HelloWorldApp / Program.cs):

        using static System.Console;
        namespace Wrox.HelloWorldApp
        {
          class Program
          {
            static void Main()
            {
              WriteLine("Hello, World! ");
            }
          }
        }

在Solution Explorer中选择项目,使用上下文菜单,打开Properties(或View | Property Pages命令)打开项目配置(如图2-5所示)。在Application选项卡,可以选择应用程序的名称、默认名称空间(这只用于新添加的项目)和应该用于解决方案的.NET Core版本。如果选择的版本与默认选项不同,则创建一个global.json文件,其中包含这个配置设置。

图2-5

2.2.3 编译和运行程序

Build菜单为构建项目提供了不同的选项。可以使用Build | Build Solution命令构建解决方案的所有项目,也可以使用Build | Build HelloWorldApp命令构建单个项目。还可以看一看Build菜单中的其他选项。

为了生成持久的文件,可以在项目属性的Build选项卡中选中Produce outputs on build复选框(如图2-6所示)。

选中Produce outputs on build复选框,构建程序后,可以看到在File Explorer中,目录artifacts包含的子目录支持列出的所有.NET Framework版本和二进制文件。

图2-6

可以在Visual Studio中选择Debug | Start Without Debugging命令运行应用程序。这将启动应用程序,如图2-7所示。

图2-7

注意:一定不要用Debug | Start Debugging命令启动应用程序;否则,就看不到应用程序的输出,因为控制台窗口在应用程序完成后立即关闭。可以使用这种方法来运行应用程序,设置断点,调试应用程序,或在Main方法结束前添加ReadLine方法。

可以使用项目属性中的Debug选项卡,配置运行应用程序时应该使用的运行库版本(如图2-8所示)。

图2-8

提示:一个解决方案有多个项目时,可以指定应该运行什么项目,方法是在Solution Explorer中选择项目,打开上下文菜单,从中选择Set as Startup Project (或Project | Set as Startup Project)命令。也可以在Solution Explorer中选择解决方案,并选择Set as Startup Project,打开解决方案的属性页,在其中可以选择启动项目。还可以定义多个要启动的项目。

2.2.4 代码的详细介绍

下面讨论C#源代码。首先对C#语法做一些一般性的解释。在C#中,与其他C风格的语言一样,语句都以分号(; )结尾,并且语句可以写在多个代码行上,不需要使用续行字符。用花括号({})把语句组合为块。单行注释以两个斜杠字符开头(//),多行注释以一个斜杠和一个星号(/*)开头,以一个星号和一个斜杠(*/)结尾。在这些方面,C#与C++和Java一样,但与Visual Basic不同。分号和花括号使C#代码与Visual Basic代码的外观差异很大。如果以前使用的是Visual Basic,就应特别注意每条语句结尾的分号。对于新接触C风格语言的用户,忽略分号常常是导致编译错误的最主要原因之一。另一个方面是,C#区分大小写,即myVar与MyVar是两个不同的变量。

在上面的代码示例中,前几行代码与名称空间有关(如本章后面所述),名称空间是把相关类组合在一起的方式。namespace关键字声明了应与类相关的名称空间。其后花括号中的所有代码都被认为是在这个名称空间中。编译器在using语句指定的名称空间中查找没有在当前名称空间中定义但在代码中引用的类。这与Java中的import语句和C++中的using namespace语句非常类似。

        using static System.Console;
        namespace Wrox
        {

在Program.cs文件中使用using static指令的原因是下面要使用一个库类System.Console。using static System.Console语句允许引用这个类的静态成员,而忽略名称空间和类名。仅声明using System,在调用WriteLine()方法时需要添加类名:

        using System;
        // etc.
        Console.WriteLine("Hello World! ");

忽略整个using语句,调用WriteLine()方法时就必须添加名称空间的名称:

        System.Console.WriteLine("Hello World! ");

标准的System名称空间包含了最常用的.NET类型。在C#中做的所有工作都依赖于.NET基类,认识到这一点非常重要;在本例中,使用了System名称空间中的Console类,以写入控制台窗口。C#没有用于输入和输出的内置关键字,而是完全依赖于.NET类。

注意:本章和后续章节中几乎所有示例都使用Console类的静态成员,所以假定所有的代码片段都包含using static System.Console;语句。

在源代码中,声明一个类Program。但是,因为该类位于Wrox.HelloWorldApp名称空间中,所以其完整的名称是Wrox.HelloWorldApp.Program:

        namespace Wrox.HelloWorldApp
        {
          class Program
          {

所有的C#代码都必须包含在类中。类的声明包括class关键字,其后是类名和一对花括号。与类相关的所有代码都应放在这对花括号中。

Program类包含一个方法Main()。每个C#可执行文件(如控制台应用程序、Windows应用程序、Windows服务和Web应用程序)都必须有一个入口点——Main()方法(注意,M大写):

        static void Main()
        {

在程序启动时调用该方法。该方法要么没有返回值(void),要么返回一个整数(int)。注意,在C#中,方法定义的格式如下:

        [modifiers] return_type MethodName([parameters])
        {
          // Method body. NB. This code block is pseudo-code.
        }

第一个方括号中的内容表示一些可选关键字。修饰符(modifiers)用于指定用户所定义的方法的某些特性,例如可以在何处调用该方法。在本例中,Main()方法没有使用public访问修饰符,如果需要对Main()方法进行单元测试,可以给它使用public访问修饰符。运行库不需要使用public访问修饰符,仍可以调用方法。运行库没有创建类的实例,调用方法时,需要修饰符static。把返回类型设置为void,在本例中,不包含任何参数。

最后,看看代码语句:

        WriteLine("Hello World! ");

在本例中,只调用了System.Console类的WriteLine()方法,把一行文本写到控制台窗口上。WriteLine()是一个静态方法,在调用之前不需要实例化Console对象。

对C#基本语法有了大致的认识后,下面就详细讨论C#的各个方面。因为没有变量不可能编写出重要的程序,所以首先介绍C#中的变量。