# 一、C# 和 .NET 介绍

欢迎来到 *C# 简洁地*。忠实于*简洁的*系列概念，这本书非常专注于一个主题:C# 编程语言。我可能会简单地提到一些你可以用 C# 编写的技术，或者解释一个特性如何适合这些技术，但是这本书的全部内容是帮助你熟悉 C# 语法。

在本章中，我将从一些介绍性信息开始，然后直接跳到一个简单的 C# 程序。

## 我能用 C# 做什么？

C# 是一种通用的、面向对象的、基于组件的编程语言。作为一种通用语言，您有许多方法可以应用 C# 来完成许多不同的任务。您可以使用 ASP.NET 构建网络应用程序，使用 Windows Presentation Foundation(WPF)构建桌面应用程序，或者为 Windows Phone 构建移动应用程序。其他应用程序包括通过 Windows Azure 在云中运行的代码，以及支持 Xamarin 平台的 iOS、Android 和 Windows Phone。有时，您可能需要一种不同的语言，如 C 或 C++，来与硬件或实时系统进行通信。然而，从一般编程的角度来看，使用 C# 可以做很多事情。

## 是什么。NET？

。NET 是一个包含语言、运行时和框架库的平台，允许开发人员创建许多类型的应用程序。C# 是。NET 语言，其中还包括 Visual Basic、F#、C++ 等。

运行时更正式的名称是公共语言运行时。以编译为中间语言为目标的编程语言。CLR 本身是一个运行 IL 的虚拟机，并提供许多服务，如内存管理、垃圾收集、异常管理、安全等。

框架类库(FCL)是一组可重用的代码，它提供了通用服务和特定于技术的平台。一般服务包括基本类型，如集合、加密、网络等等。除了普通课程外，FCL 还包括 ASP.NET、WPF、网络服务等特定技术平台。FCL 提供的价值是拥有可重用的通用组件，节省了时间和金钱，而无需自己编写代码。

有一个依赖并支持. NET 的开源和商业软件的巨大生态系统。如果你访问 CodePlex、GitHub 或任何其他开源代码存储库网站，你会看到大量用 C# 编写的项目。商业产品包括帮助您构建代码、管理系统和提供应用程序的工具和服务。Syncfusion 是这个生态系统的一部分，为许多。NET 技术。

## 编写、运行和部署 C# 程序

上一节描述了很多你可以用 C# 做的伟大的事情，但是大多数都太详细了，以至于需要自己的书。为了专注于 C# 编程语言，本书中的代码将用于控制台应用程序。控制台应用程序在命令行上运行，您将在本节中了解这一点。您可以用任何编辑器编写代码，但是本书使用 Visual Studio。

| ![](img/note.png) | 注:本书代码示例可在[https://bitbucket.org/syncfusiontech/c-succinctly](https://bitbucket.org/syncfusiontech/c-succinctly)下载。 |

### 启动新程序

您需要一个编辑器或集成开发环境来编写代码。微软提供 Visual Studio (VS)，可通过 Community Edition 免费下载，用于培训和个人用途([https://www . visualstudio . com/en-us/products/VS-2015-product-editions . aspx](https://www.visualstudio.com/en-us/products/vs-2015-product-editions.aspx))。还有其他开发工具，但是你也可以使用任何编辑器，包括记事本。Notepad++ 是另一个做语法高亮显示的编辑器，但是还有很多。本质上，您只需要能够键入文本文档。选择您选择的编辑器或 IDE，它将适用于本书中的所有程序。

| ![](img/note.png) | 注意:您需要使用 Visual Studio 2015 来编译本书中的示例。 |

要开始，我们需要运行一个程序。在 VS 中，选择**文件** > **新建** > **项目**，然后在左侧树中选择**已安装** > **模板** > **Visual C#** ，最后选择**控制台应用程序**项目类型。命名解决方案**第 01 章**，命名项目**问候语**，根据自己的喜好设置位置，点击**确定**。这将为您创建一个新的解决方案。删除 **Program.cs** 文件，添加一个**hello . cs**文件。在任何文本编辑器中，只需创建一个名为**问候. cs** 的文件。下面是一个 C# 程序，它向命令行打印问候。

```cs
    using System;

    class Greetings
    {
        static void Main()
        {
            Console.WriteLine("Greetings!");
        }
    }

```

代码清单 1

`class`是一个代码容器，定义了一个类型，命名为`Greetings`。一个`class`有成员，这个例子展示了一个名为`Main`的方法成员。方法类似于其他编程语言中的函数和过程。对于桌面应用程序类型，如控制台或 WPF，命名一个方法`Main`告诉 C# 编译器程序从哪里开始执行。`Greetings`类和`Main`方法都有花括号，称为块，表示开始和结束范围。

`void`关键字不是类型；它指示方法不返回值。对于`Main`，可以用`int`替换`void`，表示程序有返回码。命令行 shell 工具可以使用这个数字来评估程序结束的条件。它对每个程序都是唯一的，由您指定。稍后，您将了解更多关于方法和返回值的信息。

`static`修饰符表示一个`Greetings`类只有一个实例有那个`Main`方法——它就是`static`实例。`Main`必须是`static`，但其他方法可以省略`static`，使其成为实例成员。这意味着一个类或实例可以有多个副本，每个副本都有自己的方法。

由于一个程序只需要一个单一的`Main`方法，`static`就有意义了。一个管理客户的程序可能有一个`Customer`类，你需要多个实例来代表每个`Customer`。在本书后面的章节中，您将看到实例化类的例子。

`Main`方法内部是一个将单词打印到命令行的语句。用双引号括起来的单词是一个字符串。该字符串被传递给`WriteLine`方法，该方法将该字符串写入命令行，并使其移动到下一行。`WriteLine`是属于`Console`类的方法。你看这个例子，就像`Greetings`班一样，`Console`也是一个班。这个`Console`类属于`System`命名空间，这就是为什么`using`子句出现在文件的顶部，允许我们使用那个`Console`类。

代码以`System`命名空间的`using`子句开始。FCL 被分组到名称空间中，以保持代码的组织性并避免同名类型之间的冲突。这个`using`子句允许我们使用`System`命名空间中的代码，我们正在使用`Console`类。没有这个，编译器不知道`Console`是什么意思，也不知道怎么找，但是现在 C# 知道我们用的是`System.Console`类。

## 名称空间和代码组织

有多种方法来组织代码，选择应该基于您的团队的标准和您正在构建的项目的性质。组织代码的常见方法之一是使用 C# 命名空间功能。以下是命名空间在程序整体结构中的层次描述:

命名空间

类型

类型成员

在这个层次结构之外，名称空间是可选的，如前面的程序所示，其中`Greetings`类不包含在名称空间中。这意味着`Greetings`是`global`命名空间的成员。您应该避免这种做法，因为它为使用您的代码的其他开发人员在同一个命名空间中编写他们自己的`Greetings`类打开了可能性，这将导致错误，因为 C# 编译器无法确定使用哪个`Greetings`类。虽然`Greetings`可能看起来独特且不太可能，但想想常见的名称，如`File`、`Math`或`Window`，这将会导致问题。下面的程序恰当地使用了名称空间。

```cs
    using static System.Math;

    namespace Syncfusion
    {
        public class Calc
        {
            public static double Pythagorean(double a, double b)
            {
                double cSquared = Pow(a, 2) + Pow(b, 2);
                return Sqrt(cSquared);
            }
        }
    }

```

代码清单 2

`Calc`类是`Syncfusion`命名空间的成员。`Pythagorean`法是`Calc`班的成员。方法是一个代码块，它有一个名称、参数和返回值，您可以从其他代码中调用。这遵循命名空间、类、成员组织。

`System`是 FCL 中的一个名称空间，`Math`是`System`名称空间中的一个类。`using static`条款允许代码在没有完全限定的情况下使用`Math`类的静态成员。您可以使用`Pythagorean`方法中的速记语法来代替书写`Math.Pow(a, 2)`，它将`a`的值平方。`Pythagorean`方法使用`Math.Sqrt`，同样提供平方根。下面的示例显示了如何使用这些代码。

```cs
    using Syncfusion;
    using System;

    using Crypto = System.Security.Cryptography;

    namespace NamespaceDemo
    {
        class Program
        {
            static void Main()
            {
                double hypotenuse = Calc.Pythagorean(2, 3);
                Console.WriteLine("Hypotenuse: " + hypotenuse);

                Crypto.AesManaged aes = new Crypto.AesManaged();

                Console.ReadKey();
            }
        }
    }

```

代码清单 3

`Main`方法调用`Calc`类的`Pythagorean`方法，传递参数`2`和`3`，并在`hypotenuse`中接收结果。由于`Calc`在`Syncfusion`命名空间中，代码在文件顶部添加了`Syncfusion`的`using`子句。如果代码中没有包含`using`条款，`Main`将被要求使用完全限定名`Syncfusion.Calc.Pythagorean`。

上一个程序的另一个特性是命名空间别名`Crypto`。当您需要完全限定命名空间，但希望减少代码中的语法时，该语法允许您使用速记语法。如果在相同的代码中使用了另一个`Cryptography`名称空间，尽管不在这个列表中，那么完全限定是必要的。`Crypto`是`System.Security.Cryptography`的别名，`Main`在`Crypto.AesManaged`中使用该别名，以使代码更易读。

### 运行程序

本章的其余部分返回到本章前面的问候程序。

现在程序写好了，你想继续编译程序并运行它。您将希望以名称**hello . cs**保存此文件。名字不一定重要，但是按照惯例应该是有意义的，并且经常和它包含的类同名。您可以将多个类放在同一个文件中，但是如果一个类单独放在它自己的同名文件中，以后会更容易找到它。C# 文件扩展名为. cs。

在 VS 中，点击工具栏上的绿色**开始**箭头，它将构建并运行程序。程序运行和停止的速度非常快，你看不到命令行输出，所以你可以按 **Ctrl + F5** 让命令行保持打开状态。本书使用了 Visual Studio 2015，但是 Syncfusion 已经简洁地发布了[*Visual Studio 2013*](https://www.syncfusion.com/resources/techportal/ebooks/visualstudio2013)，解释了很多在 Visual Studio 2015 中仍然有效的特性。同时，我将向您展示如何直接使用 C# 编译器——好处是您可以看到 IDE 为您做了什么。

| ![](img/tip.png) | 提示:添加控制台。ReadKey()；因为 Main 中的最后一行使命令行停止并等待按键。 |

最起码你需要。NET Framework 安装在您的机器上，它对商业和非商业用途都是免费的。如果你安装了 VS，你已经有了。NET 框架。否则，从[http://www.microsoft.com/en-us/download/details.aspx?下载 id=30653](http://www.microsoft.com/en-us/download/details.aspx?id=30653) 并安装。此链接用于。NET Framework 4.5，但是任何未来的版本都应该可以工作。

一次。NET 安装好了，打开 Windows 资源管理器，搜索 C# 编译器，**csc.exe**。由于本书示例使用的是 Visual Studio 2015，所以我机器上的 C# 6 编译器位于**C:\ Program Files(x86)\ MSBuild \ 14.0 \ Bin**，但您的可能会有所不同。

接下来，确保 C# 编译器在您的路径中。打开**系统属性**窗口。写这篇文章的时候，我在 Windows 8.1 上，通过选择**控制面板** > **系统和安全** > **系统**，然后点击**高级系统设置**找到了它。选择**高级**选项卡，点击**环境变量**按钮。在**系统变量**列表中，选择**路径**，点击**编辑**。您应该会看到几个用分号分隔的路径。在该路径的末尾，添加您通过 Windows 资源管理器搜索找到的 C# 编译器路径，并确保它与前面的路径用分号隔开。设置完路径后，请关闭所有这些窗口。

既然你有了。NET Framework 已安装并具有 C# 编译器集的路径，您可以构建您在前面示例中键入的程序。首先，打开命令提示符窗口。在我的系统上，我可以这样做:按下 **Windows 徽标键+ R** ，在**运行**对话框中键入**cmd.exe**，然后单击**确定**。如果你从来没有使用过命令行，打开你最喜欢的搜索引擎，找一个教程是个好主意。或者，学习 PowerShell 可能会很好；Syncfusion 上面有一本书，书名是 *[PowerShell 简洁地](https://www.syncfusion.com/resources/techportal/ebooks/powershell)* 。同时，导航到您保存**问候语的目录。你可以在那里输入**CD \你的\路径\那里**然后按**进入**到达那里。您可以通过键入**目录**查看当前目录中有哪些文件来验证您是否在正确的位置。**

要编译程序，请键入**CSC hello . cs**。如果您看到编译器错误，请返回到[代码清单 1](#CodeListing1) 并确保您已经准确地键入了代码，然后重新编译。

| ![](img/tip.png) | 提示:使用空格分隔列表编译多个文件；例如，csc.exe 文件 1.cs 文件 2.cs。有关 C# 编译器帮助，请键入 csc.exe/帮助。 |

现在输入**目录**，你会看到一个名为**Greetings.exe**的新文件。这是一个可执行的程序集。英寸 NET 中，程序集是标识、执行和部署的单元，这就是为什么它不仅仅被称为文件。出于本书的目的，您不会涉及程序集的所有细微差别，但它是一个包含两个可执行文件的术语。exe)和库(。dll)文件。

现在输入**Greetings.exe**并按**进入**。程序将在命令行上打印`Greetings!`。然后，您将看到一个新的命令行提示，这意味着程序已经结束。这来自于`Main`方法中的`Console.WriteLine`语句。当`Main`方法结束执行时，程序也结束。

### 部署程序

。NET 使用 XCopy 部署，这意味着您只需要将程序集复制到您想要它去的任何地方。一个警告是，无论你在什么机器上运行程序，都必须有。NET CLR 已安装。安装 VS 或。NET 框架自动安装 CLR。此外，您只能安装。NET Framework Runtime，它不包括开发工具，适用于您只想运行 C# 程序但不想执行任何开发任务的机器。实际上，大多数视窗系统已经有了。NET 从原始安装中安装，并通过 Windows Update 保持更新。

无论何时运行程序，Windows 都会查看可执行文件，确定它是. NET 程序集，加载 CLR，然后将该程序集交给 CLR 运行。从用户的角度来看，CLR 行为是幕后的；当运行可执行程序时，该程序看起来像任何其他程序。

## 总结

这一章包括了一些关于 C# 如何融入的更广泛的要点。NET 框架生态系统以及如何创建 C# 程序。请记住，C# 是一种编程语言，但它构建的程序使用 FCL 来运行由 CLR 管理的应用程序。这为您提供了将程序编译成程序集的能力，这些程序集可以在任何支持 CLR 的机器上部署和运行。程序入口点是`Main`方法。您可以使用任何编辑器或像 Visual Studio 这样的 IDE 来编写代码。要运行一个程序，在 VS 中按 **F5** 或者在命令行中用`csc.exe`编译。要部署，请将程序复制到安装了 CLR 的计算机上。在下一章中，您将了解更多关于如何使用表达式和语句在 C# 中编码逻辑的信息。