分步学习 C# (CSharp) - 初学者教程:第 1 部分






4.37/5 (18投票s)
在本篇文章中,我们将逐步学习如何为初学者使用 C#。
目录
- 引言
- 第一步:获取 Visual Studio Community 版
- IDE VS 语言 vs 框架
- 理解物理结构与项目(解决方案和项目)
- 理解编译过程(IL 和 JIT 代码)
- 为什么编译成 IL 代码?
- 理解控制台应用程序的基本代码
- 本文使用的缩略语
- C# 中的变量
- IF 条件和 FOR 循环
- 进一步阅读的参考资料
引言
注意:如果您是高级开发人员,那么本文对您的帮助不大。您可以从我写的 “逐步学习 C# 设计模式”文章 开始。
另外,在您开始阅读全文之前,我建议您观看这个 “4 小时学习 C# 和 .NET 视频”,它将帮助您在短时间内上手 C#。该视频讨论了 Visual Studio 等必需工具,以及如何开始编写第一个 C# 程序等等。
第一步:获取 Visual Studio Community 版
就像鱼儿离不开水一样,没有 Visual Studio,C# 编程将非常困难。
因此,第一步是获取 Visual Studio。
访问 https://www.visualstudio.com/ 并
安装这款神器。安装成功后,您应该能在程序文件中看到它,如图
1.1 所示。
Visual Studio Community 版可免费用于学习目的。
IDE VS 语言 VS 框架
在开始 C# 实验之前,我想先澄清一下 IDE、编程语言和软件框架之间的词汇差异。我曾见过许多开发人员在不了解它们完全不同的情况下,不自觉地将 C#、.NET 和 Visual Studio 混为一谈。
Visual Studio 是一个 IDE(集成开发环境),C# 和 VB.NET 是编程语言,而 .NET 是框架。
.NET Framework 是一个由可重用组件或库组成的庞大集合。如果您浏览到“C:\Windows\Microsoft.NET\Framework”,您会看到不同版本的 .NET Framework,如果您浏览到任何一个 .NET 版本文件夹,您会看到以“System
”开头、扩展名为“DLL”的文件。
DLL 是动态链接库(Dynamic link library)的缩写。我们稍后会详细讨论 DLL。但这些 DLL 包含可重用代码,用于执行特定任务。例如,“System.Data.dll”用于将数据保存到 RDBMS,“System.Drawing.Dll”用于显示和 GUI 等目的。
所以简单来说,.NET Framework 是一个庞大的可重用组件库。
现在,为了构建一个软件应用程序,我们需要编写逻辑并调用这些组件。为此,我们需要一种编程语言。C# 和 VB.NET 是编程语言。这些语言能够消费和调用这些组件。
当我们谈论专业应用程序时,其规模非常巨大,为了更好地管理,我们需要一些自动化功能,例如
- 在 C# 代码中查找和引用 .NET Framework 组件
- 在编码时为 .NET Framework 组件提供帮助(智能感知)支持
- C# 语法检查和编译
- 等等
总之,我们需要一个工具,或者说一个集成开发环境,它可以帮助我们组织 C# 代码并根据情况引用 .NET Framework 组件。所有这些都由 VS IDE(Visual Studio IDE)完成。
如果您看到 Visual Studio,它看起来就像下面这个屏幕。是的,对初学者来说刚开始会显得复杂,但随着您对它的熟悉,您会发现这个工具多么简单而有用。
总结一下,C# 是一种语言,它利用 .NET Framework 组件来完成应用程序。
为了开发,我们需要将各种东西整合在一起,比如编译程序、引用 .NET 组件、语法检查等,所有这些都由 VS IDE 完成。所以 VS IDE 是一个工具。
理解物理结构与项目(解决方案和项目)
那么,让我们按照以下步骤打开 Visual Studio 并创建一个简单的 C# 控制台应用程序项目:
- 从程序文件打开 Visual Studio
- 点击“文件”->“新建项目”
- 选择“Windows”,然后选择“控制台应用程序”
- 为项目命名,然后点击“确定”
您会看到一些代码和显示代码文件的资源管理器。如果仔细看,代码文件会以一种结构化的方式组织。顶部是解决方案资源管理器,解决方案中有项目,每个项目包含代码文件。
因此,项目是通过使用解决方案和项目来组织的。项目是代码的独立逻辑单元,或者我们也可以将它们定义为模块。例如,在一个软件应用程序中,我们可以有不同的模块,如会计、发票等。所以您可能有一个发票项目,一个会计项目,所有这些都将归入一个解决方案。
项目中的“引用”节点显示了当前项目中引用的 .NET Framework 组件。“App.config”文件包含项目的配置信息。“Program.cs”文件将包含实际的 C# 代码和逻辑。
理解编译过程(IL 和 JIT 代码)
为了在机器上运行软件代码,我们需要经过一个称为编译的过程。当您用 C# 和 Java 等人类可读的语言编写代码时,这被称为高级语言。为了在硬件机器上运行这段代码,我们需要将其转换为机器语言(二进制)。将高级语言转换为机器语言的过程称为编译。
要编译我们当前的 C# 程序,我们需要点击 **生成**,然后选择 **生成解决方案**,如图所示。
您可以在菜单中看到我们有“生成解决方案”和“生成 ‘Lab1LearnCsharp
’”选项。生成解决方案将构建解决方案中的所有项目,而生成“Lab1LearnCsharp
”将只构建该特定项目。
如果您想知道生成、重新生成和清理解决方案是什么意思,请观看此视频 “生成 vs 重新生成 vs 清理解决方案”。
如果您想知道编译的最终文件在哪里,可以右键单击解决方案,然后点击“**在文件资源管理器中打开文件夹**”。
您会看到两个目录:“bin”和“obj”。“obj”文件夹包含单个的二进制文件,但它们尚未链接。而“bin”文件夹包含最终编译的二进制文件。
那么,根据我上面所说的所有知识,您可能会认为“bin”就是最终的机器码。但事实并非完全如此。当您点击生成时,.NET 编译器将其编译成一种中间语言代码,简称为 IL 代码。这种 IL 代码是一种半编译的代码。
如果您想查看 IL 代码,可以点击程序文件,打开开发人员命令提示符,然后在命令中输入 ILDASM
。
您应该会看到类似下面的屏幕。ILDASM(IL 反汇编器)是一个随 Visual Studio 安装附带的简单工具,可帮助您查看 IL 代码。点击“文件”->“打开”,然后浏览到“bin”目录并尝试打开“exe”文件。
如果您打开 EXE 文件,您应该会看到类似下图所示的内容。这就是 IL 代码。所以您可以看到 EXE 不是一个完全编译的机器二进制文件,而是一个半编译的代码。
接下来我们脑海中浮现的问题是:谁来进行最终编译?何时进行?最终编译是在运行时进行的,由 JIT(Just In Time 编译器)完成。
因此,当应用程序 EXE 开始运行时,JIT 就会启动,并按需将代码编译成机器码。
以下是编译过程:
- C# 代码使用 Visual Studio 编译为 IL。换句话说,当您点击生成时,它会编译成 IL 代码,并将编译后的 IL 代码放入 debug 目录。
- 当 EXE 开始运行时,它会启动 JIT 引擎,JIT 按需将代码编译成针对该环境优化的机器码。
为什么编译成 IL 代码?
但是,现在下一个令人费解的问题是:为什么要编译成中间代码,而不是直接完全编译?因为如果应用程序在运行时进行即时编译,这可能会损害应用程序的性能。
现在,当我们说编译成机器码时,它不仅涉及源代码,还涉及操作系统类型、机器配置(如 32 位或 64 位)等等。因此,根据环境,它会编译出优化的机器码。
现在,如果开发人员在他的机器上进行完全编译,那么机器编译将根据开发人员的机器进行。当我们在另一台机器上运行时,这段机器码并未针对该环境进行优化。
因此,在运行时编译非常有意义,因为在运行时,我们可以知道环境配置是什么,并根据该环境编译出优化后的代码。
理解控制台应用程序的基本代码
让我们尝试理解基本的控制台应用程序代码。首先,所有代码都在 program.cs 文件中。其中,您首先遇到的一堆代码是“using
”语句。
using
语句用于引用代码在“program.cs”文件中使用的 .NET Framework 组件。
using System;
using System.Collections.Generic;
using System.Linq;
usingSystem.Text;
usingSystem.Threading.Tasks;
接下来是“static void main
”,这个东西被称为函数。函数是一组 C# 语句,您可以向其传递输入并获取输出。如果您看到“main
”函数接受一个参数“args
”,并且不返回任何内容,这个“不返回”用“void
”表示。
暂时搁置“static
”这个词。我们稍后会讨论它。现在,在我们的“Main
”函数中,我们只显示了“Hello
”。“Console
”是 .NET 的内置命名空间,“WriteLine
”是函数,我们将“Hello
”作为参数进行显示。
staticvoid Main(string[] args)
{
Console.WriteLine("Hello");
}
函数包含在类中,而类又被逻辑地分组到称为命名空间的东西中。当我们在后面的章节讨论面向对象编程时,我们将讨论“类”和“命名空间”。
下面是命名空间、类和函数的代码。
namespace Lab1LearnCSharp
{
classProgram
{
staticvoid Main(string[] args)
{
Console.WriteLine("Hello");
}
}
}
所以,目前,programs.cs 的完整 C# 代码如下所示。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Lab1LearnCSharp
{
classProgram
{
staticvoid Main(string[] args)
{
Console.WriteLine("Hello");
}
}
}
要运行程序,请按 **Ctrl + F5**,您应该会看到下面的输出。
本文使用的缩略语
- VS:Visual Studio
- IDE:集成开发环境
- DLL:动态链接库
- IL:中间语言
- ILDASM:中间语言反汇编器
- JIT:即时编译器
C# 中的变量
当 C# 应用程序执行时,它需要在内存中存储一些临时数据,这通过称为变量的东西来完成。要在 C# 中声明变量,语法模板如下:
// DataType variableName
int num=10; // declares a variable with name “num” and data type integer
您可以看到我修改了之前的实验,使用了 string
变量。因此,最终用户输入数据,该数据存储在 string
变量中,然后该 string
变量显示在控制台上。
staticvoid Main(string[] args)
{
stringstr = Console.ReadLine().ToString(); // read data from the input keyboard
Console.WriteLine(str); // display what is entered in the str variable
Console.Read(); // make the application wait
}
以下是逐行解释:
代码 | 解释 |
// 从键盘输入读取数据 | 双斜杠用于注释。注释意味着这不是代码,而是对代码的一种文本解释。// 中的任何内容都不会被编译。好的代码总是有注释,这样新开发人员进入项目时才能理解。 |
stringstr = Console.ReadLine().ToString(); | 在这一行代码中,我们声明了一个 string 变量“str ”,而“Console.Read() ”将使程序等待键盘输入。一旦使用键盘输入了某些数据,它就会存储在“str ”变量中。 |
Console.WriteLine(str) | 在这一行代码中,我们显示了存储在“str ”变量中的内容。 |
Console.Read(); | 您可能会对又一个 Console.read() 感到惊讶。这个 Console.Read() 会让应用程序暂停,以便我们能看到输出。如果没有这个语句,应用程序会立即退出,我们将无法看到结果。 |
IF 条件和 FOR 循环
在编程中,我们总是需要条件检查。这意味着如果满足某个条件,则执行一部分代码,否则执行另一部分代码。
所以,要编写“IF
”条件,我们将条件放在圆括号(“(
”)内,并将要执行的代码放在花括号“{
”内。如果我们希望在条件不满足时执行的代码,则写在“else
”部分。
if (str.Length != 0)
{
// Do this
}
else
{
// or else Do this
}
在任何编程逻辑中,我们还需要在循环中执行代码。现在,循环可以是有限循环或无限循环。为了在循环中执行代码,我们需要使用如下所示的“for
”语法。 “for
”接受三个参数:
- 第一个参数“
int i =0
”初始化变量。所以这个 for 循环将从“0
”开始。 - 第二个参数是这个
for
循环应该运行的条件。在这种情况下,它将运行 9 次。如果您能猜到为什么我说运行 9 次而不是 10 次吗? - 第三个参数表示变量是递增还是递减。
for (int i = 0; i < 10; i++)
{
}
因此,下面是一个简单的 C# 示例代码,演示了“if
”条件和“for
”循环的用法。在下面的示例中,我们从键盘读取输入,然后将该输入值显示 10 次。
if (str.Length != 0)
{
}
for (int i = 0; i < 10; i++)
{
}
stringstr = Console.ReadLine().ToString(); // read data from the input keyboard
if (str.Length != 0)
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine(str); // display what is entered in the str variable
}
Console.Read();// make the application wait
}
以下是输出应该的样子。
下一教程有什么内容?
在下一教程中,我们将讨论 for
循环、if
条件以及从控制台读取数据。我们还将了解 CLR、CTS、CLS 和 CAS 等概念。所以,恭喜您完成了第一部分。希望您已准备好迎接第二部分。
进一步阅读的参考资料
- 这个 “学习 C# (C sharp)” 视频将帮助您快速入门,包括从哪里下载 Visual Studio 以及如何运行您的第一个程序。
- 这个 6 分钟的视频深入解释了 “生成 vs 重新生成 vs 清理解决方案”。
进一步阅读,请观看下面的面试准备视频和分步视频系列。