65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.37/5 (18投票s)

2016 年 11 月 28 日

CPOL

12分钟阅读

viewsIcon

85091

downloadIcon

693

在本篇文章中,我们将逐步学习如何为初学者使用 C#。

目录

引言

注意:如果您是高级开发人员,那么本文对您的帮助不大。您可以从我写的 “逐步学习 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 版可免费用于学习目的。

图 1.1:已安装的 Visual Studio

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 是一个庞大的可重用组件库。

图 1.2

现在,为了构建一个软件应用程序,我们需要编写逻辑并调用这些组件。为此,我们需要一种编程语言。C# 和 VB.NET 是编程语言。这些语言能够消费和调用这些组件。

当我们谈论专业应用程序时,其规模非常巨大,为了更好地管理,我们需要一些自动化功能,例如

  • 在 C# 代码中查找和引用 .NET Framework 组件
  • 在编码时为 .NET Framework 组件提供帮助(智能感知)支持
  • C# 语法检查和编译
  • 等等

总之,我们需要一个工具,或者说一个集成开发环境,它可以帮助我们组织 C# 代码并根据情况引用 .NET Framework 组件。所有这些都由 VS IDE(Visual Studio IDE)完成。

如果您看到 Visual Studio,它看起来就像下面这个屏幕。是的,对初学者来说刚开始会显得复杂,但随着您对它的熟悉,您会发现这个工具多么简单而有用。

图 1.3:IDE 视图

总结一下,C# 是一种语言,它利用 .NET Framework 组件来完成应用程序。

为了开发,我们需要将各种东西整合在一起,比如编译程序、引用 .NET 组件、语法检查等,所有这些都由 VS IDE 完成。所以 VS IDE 是一个工具。

图 1.4: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 就会启动,并按需将代码编译成机器码。

以下是编译过程:

  1. C# 代码使用 Visual Studio 编译为 IL。换句话说,当您点击生成时,它会编译成 IL 代码,并将编译后的 IL 代码放入 debug 目录。
  2. 当 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 等概念。所以,恭喜您完成了第一部分。希望您已准备好迎接第二部分。

进一步阅读的参考资料

进一步阅读,请观看下面的面试准备视频和分步视频系列。

© . All rights reserved.