原文: https://zetcode.com/lang/csharp/basics/

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

C# 简单示例

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

Program.cs

  1. using System;
  2. namespace Simple
  3. {
  4. class Program
  5. {
  6. static void Main(string[] args)
  7. {
  8. Console.WriteLine("This is C#");
  9. }
  10. }
  11. }

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

  1. using System;

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

  1. namespace Simple
  2. {

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

  1. class Program
  2. {
  3. ...
  4. }

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

  1. static void Main(string[] args)
  2. {
  3. ...
  4. }

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

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

  1. Console.WriteLine("This is C#");

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

  1. $ dotnet run
  2. This is C#

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

C# 控制台读取值

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

Program.cs

  1. using System;
  2. namespace ReadLine
  3. {
  4. class Program
  5. {
  6. static void Main(string[] args)
  7. {
  8. Console.Write("Enter your name: ");
  9. string name = Console.ReadLine();
  10. Console.WriteLine("Hello {0}", name);
  11. }
  12. }
  13. }

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

  1. string name = Console.ReadLine();

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

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

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

  1. $ dotnet run
  2. Enter your name: Jan
  3. Hello Jan

这是第二个程序的输出。

C# 命令行参数

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

Program.cs

  1. using System;
  2. namespace CommandLineArgs
  3. {
  4. class Program
  5. {
  6. static void Main(string[] args)
  7. {
  8. for (int i = 0; i < args.Length; i++)
  9. {
  10. Console.WriteLine("{0}", args[i]);
  11. }
  12. }
  13. }
  14. }

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

  1. public static void Main(string[] args)

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

  1. for (int i=0; i<args.Length; i++)
  2. {
  3. Console.WriteLine("{0}", args[i]);
  4. }

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

  1. $ dotnet run 1 2 3
  2. 1
  3. 2
  4. 3

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

C# 变量

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

Program.cs

  1. using System;
  2. namespace Variables
  3. {
  4. class Program
  5. {
  6. static void Main(string[] args)
  7. {
  8. string city = "New York";
  9. string name = "Paul"; int age = 35;
  10. string nationality = "American";
  11. Console.WriteLine(city);
  12. Console.WriteLine(name);
  13. Console.WriteLine(age);
  14. Console.WriteLine(nationality);
  15. city = "London";
  16. Console.WriteLine(city);
  17. }
  18. }
  19. }

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

  1. string city = "New York";

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

  1. string name = "Paul"; int age = 35;

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

  1. Console.WriteLine(city);
  2. Console.WriteLine(name);
  3. Console.WriteLine(age);
  4. Console.WriteLine(nationality);

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

  1. city = "London";

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

  1. $ dotnet run
  2. New York
  3. Paul
  4. 35
  5. American
  6. London

这是示例的输出。

var关键字

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

Program.cs

  1. using System;
  2. namespace ImplicitType
  3. {
  4. class Program
  5. {
  6. static void Main(string[] args)
  7. {
  8. var name = "Peter";
  9. var age = 23;
  10. Console.WriteLine("{0} is {1} years old", name, age);
  11. name = "Jozef";
  12. age = 32;
  13. Console.WriteLine("{0} is {1} years old", name, age);
  14. Console.WriteLine(name.GetType());
  15. Console.WriteLine(age.GetType());
  16. }
  17. }
  18. }

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

  1. var name = "Peter";
  2. var age = 23;

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

  1. Console.WriteLine(name.GetType());
  2. Console.WriteLine(age.GetType());

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

  1. $ dotnet run
  2. Peter is 23 years old
  3. Jozef is 32 years old
  4. System.String
  5. System.Int32

这是输出。

C# List集合

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

Program.cs

  1. using System;
  2. using System.Collections.Generic;
  3. namespace ListCollection
  4. {
  5. class Program
  6. {
  7. static void Main(string[] args)
  8. {
  9. var words = new List<string> { "stone", "rock", "falcon", "sky" };
  10. Console.WriteLine(words[2]);
  11. Console.WriteLine();
  12. foreach (var word in words)
  13. {
  14. Console.WriteLine(word);
  15. }
  16. }
  17. }
  18. }

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

  1. using System.Collections.Generic;

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

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

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

  1. Console.WriteLine(words[2]);

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

  1. foreach (var word in words)
  2. {
  3. Console.WriteLine(word);
  4. }

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

  1. $ dotnet run
  2. falcon
  3. stone
  4. rock
  5. falcon
  6. sky

This is the output.

C# 丢弃

丢弃是特殊的只写变量,用于丢弃程序员不感兴趣的值。 _(下划线字符)用于丢弃。

Program.cs

  1. using System;
  2. namespace SimpleDiscard
  3. {
  4. class Program
  5. {
  6. static void Main(string[] args)
  7. {
  8. var vals = (1, 2, 3, 4, 5, 6);
  9. (int x, int y, int z, _, _, _) = vals;
  10. Console.WriteLine(x);
  11. Console.WriteLine(y);
  12. Console.WriteLine(z);
  13. }
  14. }
  15. }

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

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

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

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

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

C# Range()方法

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

Program.cs

  1. using System;
  2. using System.Linq;
  3. namespace RangeEx
  4. {
  5. class Program
  6. {
  7. static void Main(string[] args)
  8. {
  9. foreach(var el in Enumerable.Range(1, 10))
  10. {
  11. Console.WriteLine(el);
  12. }
  13. }
  14. }
  15. }

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

C# 常数

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

Program.cs

  1. using System;
  2. namespace Constants
  3. {
  4. class Program
  5. {
  6. static void Main(string[] args)
  7. {
  8. const int WIDTH = 100;
  9. const int HEIGHT = 150;
  10. int var = 40;
  11. var = 50;
  12. // WIDTH = 110;
  13. }
  14. }
  15. }

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

  1. const int WIDTH = 100;
  2. const int HEIGHT= 150;

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

  1. int var = 40;
  2. var = 50;

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

  1. // WIDTH = 110;

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

C# 字符串格式

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

Program.cs

  1. using System;
  2. namespace StringFormat
  3. {
  4. class Program
  5. {
  6. static void Main(string[] args)
  7. {
  8. int age = 34;
  9. string name = "William";
  10. string msg = string.Format("{0} is {1} years old.", name, age);
  11. Console.WriteLine(msg);
  12. }
  13. }
  14. }

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

  1. int age = 34;
  2. string name = "William";

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

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

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

  1. $ dotnet run
  2. William is 34 years old.

这是程序的输出。

C# 字符串插值

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

Program.cs

  1. using System;
  2. namespace VariableInterpolation
  3. {
  4. class Program
  5. {
  6. static void Main(string[] args)
  7. {
  8. string name = "Peter";
  9. int age = 34;
  10. string msg = $"{name} is {age} years old";
  11. Console.WriteLine(msg);
  12. }
  13. }
  14. }

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

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

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

  1. $ dotnet run
  2. Peter is 34 years old

This is the output of the program.

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