# C# 基础

> 原文： [https://zetcode.com/lang/csharp/basics/](https://zetcode.com/lang/csharp/basics/)

在 C# 教程的这一部分中，我们将介绍 C# 语言的基本编程概念。 我们介绍非常基本的程序。 我们处理变量，常量和基本数据类型。 我们在控制台上读写； 我们提到了变量插值。

## C# 简单示例

我们从一个非常简单的代码示例开始。

`Program.cs`

```cs
using System;

namespace Simple
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("This is C#");
        }
    }
}

```

这是我们的第一个 C# 程序。 它将在控制台中显示`"This is C#"`消息。 我们将逐行解释。

```cs
using System;

```

`using`关键字将特定的名称空间导入我们的程序。 创建命名空间是为了将命名实体与其他实体进行分组和/或区分。 这样可以防止名称冲突。 这行是 C# 语句。 每个语句以分号结尾。

```cs
namespace Simple
{

```

我们声明一个名称空间。 命名空间用于组织代码并防止名称冲突。

```cs
class Program
{
    ...
}

```

每个 C# 程序都是结构化的。 它由类及其成员组成。 类是 C# 程序的基本构建块。 上面的代码是一个类定义。 该定义具有一个主体，该主体以左花括号（`{`）开始，以右花括号（`}`）结尾。

```cs
static void Main(string[] args)
{
    ...
}

```

`Main()`是一种方法。 方法是为执行特定工作而创建的一段代码。 我们没有将所有代码放在一个地方，而是将其分为多个部分，称为方法。 这为我们的应用带来了模块化。 每个方法都有一个主体，我们在其中放置语句。 方法的主体用大括号括起来。

`Main()`方法的特定工作是启动应用。 它是每个控制台 C# 程序的入口点。 该方法声明为`static`。 无需创建`Program`类的实例即可调用此静态方法。 首先，我们需要启动应用，然后，我们能够创建类的实例。 `Main()`方法具有`args`参数，该参数存储命令行参数。

```cs
Console.WriteLine("This is C#");

```

在此代码行中，我们将`"This is C#"`字符串打印到控制台。 要将消息打印到控制台，我们使用`Console`类的`WriteLine()`方法。 该类表示控制台应用的标准输入，输出和错误流。 请注意，`Console`类是`System`命名空间的一部分。 这行是使用`using System;`语句导入名称空间的原因。 如果不使用该语句，则必须使用`WriteLine()`方法的完全限定名称：`System.Console.WriteLine("This is C#");`。

```cs
$ dotnet run
This is C#

```

执行程序将得到以上输出。

## C# 控制台读取值

我们也可以使用`Console`类读取值。

`Program.cs`

```cs
using System;

namespace ReadLine
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("Enter your name: ");

            string name = Console.ReadLine();
            Console.WriteLine("Hello {0}", name);
        }
    }
}

```

第二个程序从控制台读取一个值并打印出来。

```cs
string name = Console.ReadLine();

```

我们从终端读取一行。 当我们按下`Enter`键时，输入将分配给`name`变量。 输入存储在`name`变量中，该变量声明为`string`类型。

```cs
Console.WriteLine("Hello {0}", name);

```

在此代码行中，我们进行字符串格式化。 `{0}`指示符替换为`name`变量的值。

```cs
$ dotnet run
Enter your name: Jan
Hello Jan

```

这是第二个程序的输出。

## C# 命令行参数

C# 程序可以接收命令行参数。 当我们运行程序时，它们会遵循程序的名称。

`Program.cs`

```cs
using System;

namespace CommandLineArgs
{
    class Program
    {
        static void Main(string[] args)
        {
            for (int i = 0; i < args.Length; i++)
            {
                Console.WriteLine("{0}", args[i]);
            }
        }
    }
}

```

命令行参数可以传递给`Main()`方法。

```cs
public static void Main(string[] args)

```

`Main()`方法接收命令行参数的字符串数组。

```cs
for (int i=0; i<args.Length; i++)
{
    Console.WriteLine("{0}", args[i]);
}

```

我们使用`for`循环遍历这些参数的数组，并将它们打印到控制台。 `Length`属性给出数组中元素的数量。 循环和数组将在后面更详细地描述。

```cs
$ dotnet run 1 2 3
1
2
3

```

我们提供了三个数字作为命令行参数，并将它们打印到控制台上。

## C# 变量

变量是存储数据的地方。 变量具有名称和数据类型。 数据类型确定可以为变量分配哪些值，例如整数，字符串或布尔值。 随着时间的推移，程序变量可以获得相同数据类型的各种值。 在对变量进行任何引用之前，始终将变量初始化为其类型的默认值。

`Program.cs`

```cs
using System;

namespace Variables
{
    class Program
    {
        static void Main(string[] args)
        {
            string city = "New York";
            string name = "Paul"; int age = 35;
            string nationality = "American";

            Console.WriteLine(city);
            Console.WriteLine(name);
            Console.WriteLine(age);
            Console.WriteLine(nationality);

            city = "London";
            Console.WriteLine(city);
        }
    }
}

```

在示例中，我们有四个变量。

```cs
string city = "New York";

```

我们声明一个字符串类型的`city`变量，并将其初始化为`"New York"`值。

```cs
string name = "Paul"; int age = 35;

```

我们声明并初始化另外两个变量。 我们可以将两个语句放在一行上。 但是出于可读性原因，每个语句应放在单独的行上。

```cs
Console.WriteLine(city);
Console.WriteLine(name);
Console.WriteLine(age);
Console.WriteLine(nationality);

```

我们将变量的值打印到终端。

```cs
city = "London";

```

我们为`city`变量分配一个新值。

```cs
$ dotnet run
New York
Paul
35
American
London

```

这是示例的输出。

## `var`关键字

可以使用`var`关键字隐式地键入方法范围内的变量。 变量始终是强类型，但是使用`var`时，C# 编译器从赋值的右侧推断类型。

`Program.cs`

```cs
using System;

namespace ImplicitType
{
    class Program
    {
        static void Main(string[] args)
        {
            var name = "Peter";
            var age = 23;

            Console.WriteLine("{0} is {1} years old", name, age);

            name = "Jozef";
            age = 32;

            Console.WriteLine("{0} is {1} years old", name, age);

            Console.WriteLine(name.GetType());
            Console.WriteLine(age.GetType());
        }
    }
}

```

在程序中，我们有两个隐式类型的变量。

```cs
var name = "Peter";
var age = 23;

```

在分配的左侧，我们使用`var`关键字。 `name`变量为`string`类型，`age`为`int`类型。 从分配的右侧推断类型。

```cs
Console.WriteLine(name.GetType());
Console.WriteLine(age.GetType());

```

我们用`GetType()`确定变量的类型。

```cs
$ dotnet run
Peter is 23 years old
Jozef is 32 years old
System.String
System.Int32

```

这是输出。

## C# `List`集合

尽管变量保留单个值，但可以将多个值添加到集合中。 `List`是元素的序列，可以通过使用`[]`进行索引操作来访问。 列表中的元素可以使用例如 `foreach`关键字。

`Program.cs`

```cs
using System;
using System.Collections.Generic;

namespace ListCollection
{
    class Program
    {
        static void Main(string[] args)
        {
            var words = new List<string> { "stone", "rock", "falcon", "sky" };

            Console.WriteLine(words[2]);

            Console.WriteLine();

            foreach (var word in words)
            {
                Console.WriteLine(word);
            }
        }
    }
}

```

在示例中，我们处理单词列表。

```cs
using System.Collections.Generic;

```

为了使用`List`，我们需要导入`System.Collections.Generic`命名空间。

```cs
var words = new List<string> { "stone", "rock", "falcon", "sky" };

```

使用`new`关键字创建一个列表对象。 在尖括号`<>`之间，我们指定列表元素的数据类型。 该列表用大括号`{}`中的元素初始化。

```cs
Console.WriteLine(words[2]);

```

在这里，我们将第三个元素打印到控制台。 （索引从 0 开始。）

```cs
foreach (var word in words)
{
    Console.WriteLine(word);
}

```

使用`foreach`循环，我们遍历列表的所有元素并将其打印到控制台。 在每个循环中，`word`变量都被指定为列表中的元素之一。

```cs
$ dotnet run
falcon

stone
rock
falcon
sky

```

This is the output.

## C# 丢弃

丢弃是特殊的只写变量，用于丢弃程序员不感兴趣的值。 `_`（下划线字符）用于丢弃。

`Program.cs`

```cs
using System;

namespace SimpleDiscard
{
    class Program
    {
        static void Main(string[] args)
        {
            var vals = (1, 2, 3, 4, 5, 6);

            (int x, int y, int z, _, _, _) = vals;

            Console.WriteLine(x);
            Console.WriteLine(y);
            Console.WriteLine(z);
        }
    }
}

```

该示例定义值的元组。 通过使用解构操作，我们将元组的值分配给变量。

```cs
var vals = (1, 2, 3, 4, 5, 6);

```

我们定义了六个值的元组。 元组是有序的异构元素的集合。

```cs
(int x, int y, int z, _, _, _) = vals;

```

说，我们只对元组的前三个值感兴趣。 在分配的左侧，我们定义了三个变量：`x`，`y`和`y`。 由于`vals`元组具有六个元素，因此我们也需要在左侧具有六个变量。 在这里，我们可以将`_`字符用于其余变量。 通过这种方式，我们表明当前这些值对我们并不重要，我们将不使用它们。

## C# `Range()`方法

`Range()`方法生成指定范围内的数字序列。 第一个参数是序列中第一个整数的值。 第二个参数是要生成的连续整数的数量。

`Program.cs`

```cs
using System;
using System.Linq;

namespace RangeEx
{
    class Program
    {
        static void Main(string[] args)
        {
            foreach(var el in Enumerable.Range(1, 10))
            {
                 Console.WriteLine(el);
            }
        }
    }
}

```

该示例使用`foreach`循环将值`1..10`打印到终端。 整数序列是用`Range()`方法生成的。

## C# 常数

与变量不同，常量保留其值。 一旦初始化，便无法修改。 使用`const`关键字创建常量。

`Program.cs`

```cs
using System;

namespace Constants
{
    class Program
    {
        static void Main(string[] args)
        {
            const int WIDTH = 100;
            const int HEIGHT = 150;
            int var = 40;

            var = 50;

            // WIDTH = 110;
        }
    }
}

```

在此示例中，我们声明两个常量和一个变量。

```cs
const int WIDTH = 100;
const int HEIGHT= 150;

```

我们使用`const`关键字通知编译器我们声明了一个常量。 按照惯例，用大写字母写常量。

```cs
int var = 40;

var = 50;

```

我们声明并初始化一个变量。 稍后，我们为变量分配一个新值。

```cs
// WIDTH = 110;

```

使用常数是不可能的。 如果取消注释此行，则会出现编译错误。

## C# 字符串格式

从变量构建字符串是编程中非常常见的任务。 C# 具有`string.Format()`方法来格式化字符串。

`Program.cs`

```cs
using System;

namespace StringFormat
{
    class Program
    {
        static void Main(string[] args)
        {
            int age = 34;
            string name = "William";

            string msg = string.Format("{0} is {1} years old.", name, age);
            Console.WriteLine(msg);
        }
    }
}

```

字符串在 C# 中是不可变的。 我们无法修改现有字符串。 我们必须从现有字符串和其他类型创建一个新字符串。 在代码示例中，我们创建一个新字符串。 我们还使用来自两个变量的值。

```cs
int age = 34;
string name = "William";

```

在这里，我们定义两个变量。

```cs
string msg = string.Format("{0} is {1} years old.", name, age);

```

我们使用内置字符串类的`Format()`方法。 `{0}`和`{1}`是求值变量的地方。 数字代表变量的位置。 `{0}`计算得出第一个提供的变量，`{1}`计算得出第二个变量。

```cs
$ dotnet run
William is 34 years old.

```

这是程序的输出。

## C# 字符串插值

一些动态语言（如 Perl，PHP 或 Ruby）支持字符串/变量插值。 变量插值是用字符串字面值中的值替换变量。 从 C# 6.0 开始，C# 支持变量插值。

`Program.cs`

```cs
using System;

namespace VariableInterpolation
{
    class Program
    {
        static void Main(string[] args)
        {
            string name = "Peter";
            int age = 34;

            string msg = $"{name} is {age} years old";

            Console.WriteLine(msg);
        }
    }
}

```

在代码示例中，我们使用变量插值构建字符串。

```cs
string msg = $"{name} is {age} years old";

```

字符串前面带有`$`字符，并且变量在大括号内。

```cs
$ dotnet run
Peter is 34 years old

```

This is the output of the program.

本章介绍了 C# 语言的一些基础知识。