撰写了文章 更新于 2019-12-25 14:29:28
从C#开始的编程入门——你好,世界
“我一开始也被这个标题骗了”
本文主要谈一些基础知识的铺垫,以及经典的Hello, world程序。
不过老实说这些“基础”知识,很多东西一展开就是一个学科,所以不可能一篇文章就讲得大家心服口服,想要了解更多内容的朋友可以自行搜索相关内容。总的来说也是说得比较简单和诙谐,有的地方对于计算机科学来说可能不那么严谨,主要是力求让非专业的朋友也能有一个大概的理解。很多概念我贴上了维基百科的词条页面,有兴趣可以深入阅读一些。如果下面的内容你不能完全读懂也没关系,就当看故事也行,如果你对计算机科学不感兴趣,那么只需要有个大概的了解就行,不影响后续学习。
有相关知识背景的可以直接跳过。
如何叫计算机帮你做事
人和计算机无法相互理解。
何况人和计算机呢
计算机其实很笨,它只认识二进制的东西。提到二进制这个词,你想到的可能就是科幻电影中滚动的1010110。一定程度上来说,计算机能理解的东西,确实是这样的。无论是文字,还是图片,还是你玩的游戏,对于计算机来说,都无非是一系列二进制流。这些东西呈现出来只对人类有意义,计算机的唯一工作就是不断地读取指令,执行指令,处理数据。告诉计算机做什么的,是人,人给电脑编写的一系列指令,我们称为程序,用来表示程序的具有某种特殊格式的文本,就是我们所说的代码,也即是源代码。
不过,你肯定不希望说这种由1和0组成的“计算机语”来指挥它们。
别说0和1了,第一次看见这种你也麻了
上图来自维基百科的这里,图片为CC BY-SA 3.0许可。
因此聪明的人类发明了更加方便人类阅读和编写的各种编程语言来提高编写计算机代码的效率。编程语言可以按照不同的方式划分成不同的类型,C#就是其中一种“高级语言”。
高级语言的“高级”,并不是说“我等级比你高,我比你厉害”这个高级。所谓的高级指的是“离底层的硬件更高”,或者也可以理解为“抽象的层次更高”。其实现代个人计算机的普及以及易用性都归功于对硬件的一层层抽象,有了良好的抽象,用户便无需管理底层硬件的原理,从而让非专业人士也能简单地使用这种一开始只有专家才能用的机器。
高级语言是一种更接近人话的语言。它们有更高的可读性,人类使用时有更高的效率。编程语言,尤其是高级语言,对很多概念进行了抽象,使得我们在大部分时候不需要直面1010110,甚至不需要关心一些底层复杂的概念,如内存地址。
但是你始终要记得,计算机最终还是只认识1010110。 这个时候需要一位翻译官,它的名字就叫做编译器,它会把我们写的高级语言代码,从上到下编译成计算机真正可以读懂的语言。大部分时候,所谓的代码,和保存代码的源文件,在经过编译器的翻译之前,和一个普通的文本文件真就没多少区别(除了括号等符号多一点)。因为高级语言更多的时候是我们人类在看,计算机并不能看懂它,更不懂我们人类想让它做的事情。
之所以称为源代码,是因为还有目标代码的概念,并不是所有的语言经过一次编译就生成了计算机可以直接理解的二进制代码。其中像C/C++、Rust、Go等语言都可以直接编译为二进制代码(严格地说,即使是这些语言,编译过程中也可能会产生中间产物而不是直接编译为二进制代码),但是像C#和Java等语言经过编译器编译之后的产物实际上是一种中间语言,此时这些代码仍然无法被计算机直接理解,但是它们会在运行时实时地被进一步处理生成二进制代码,从而被计算机执行。
还有些编程语言被称为解释型语言,它们在执行之前不需要被编译,它们需要被另一种已经写好的程序在运行时一边读取代码一遍分析代码的意思然后通过那个程序来来执行。比如十分热门的Python便是解释型语言,非常直观的就是你只需要输入python加文件名就可以看到结果,而不像那些语言需要先有一个编译的过程。支持解释型语言执行的程序被称为解释器,同样的语言可以用不同的语言去实现它的解释器,比如Python就有C、C#、Java等语言实现的解释器。
事实上现在像编译型语言和解释型语言之间的界限相对来说比较模糊,同样的语言标准,可以用多种不同的技术去实现。同样的语言可以是编译型的但也可以解释执行,还可以先编译再执行,又编译又执行,甚至编译成其他现成的高级语言再按照那种语言的方式执行。
什么是C#
按照惯例,还是使用那种“XX语言是XX型的、支持XX范式的XX语言”句式来用一句话描述一下C#这门语言。
C#是一门通用的、强类型的、面向对象(基于类)的、支持多种编程范式的编程语言。
我明白,上面这一句,你可能基本上看不懂。但是,我们会在整个过程中慢慢讲到这些特性是如何体现的。
划重点:C#读作“see-sharp”,而不是“C井”。懂音乐懂朋友可能眼前一亮了,这个井号类似于乐谱中的升调符号,因此也就读作sharp。你非要按中文读的话,可能C升比较贴切
.NET与C#
说到C#就不得不说.NET。你现在已经知道C#是一门编程语言,那么.NET又是什么呢。 其实Java语言和Java体系结构,与C#和.NET相比有很多的相似之处。整个.NET平台的诞生也和Java有着难以说清的关系。这背后有关微软和Sun之间的奇闻逸事,可以参考。
.NET不是一个编程语言,也不是一个库,更不是IDE或者什么杂七杂八的。.NET是一个开发平台,它定义了一系列基础设施的标准,比如编程语言及其编译工具、标准库、运行时环境等等。拿Java来说,和.NET对应的概念应当是Java平台,和C#对应的概念才是Java语言。
.NET标准现目前有多种实现,就像Java也有SE、EE等版本。大家最熟悉的,莫过于.NET Framework。它是.NET在Windows上的实现。可以说如果你拿的是Windows电脑在看这篇文章,那么你已经在使用了。.NET Framework在Windows 7之后的系统上属于默认安装。它承载了Windows系统很多部分的工作,并且很多Windows桌面应用都使用运行在.NET Framework上的框架(如WPF)开发。
.NET Framework最大的弱势在于它只能在Windows上工作。.NET有它的跨平台实现版本。比如历史相对悠久的Mono就是一个跨平台.NET实现。Unity的某些部分便使用了Mono。
提到跨平台实现就不得不说.NET Core,也是本系列文章的主角。.NET Core也是一个跨平台实现,并且是微软的开源项目。.NET Core不再和Windows绑死。它不仅跨平台,并且在最新版本中有显著的性能提升,可以说是目前.NET的先锋军。有了.NET Core之后,ASP.NET Core也随之诞生,ASP.NET构建的web应用程序不再只能在Windows上运行。.NET的生态在.NET Core诞生之后由于开源社区的逐渐壮大也肯定会好起来的(大概)。
C#是.NET平台都支持的编程语言之一,实际上也是旗舰语言,就像Java之于Java平台一样。.NET和Java一样,他们所支持的编程语言的源文件在编译后并不是直接生成机器代码。而是生成一种中间语言,或者说中间表示。.NET的这种中间语言叫做CIL,Java则是Java字节码。随后在运行时被虚拟机即时编译为机器代码。.NET的虚拟机组件叫CLR,Java就是大家可能听说过的JVM,即Java虚拟机。因此从本质上来说,无论什么语言,只要能编译成这种中间代码,那么就能在.NET或者Java平台上运行。因此也就是大家现在看到的情况,.NET上可以支持C#、VB(VB.NET)、C++(C++/CX)、Python(IronPython)、Ruby(IronRuby)等语言,就像Java平台上除了Java也有像Kotlin等语言。
准备活动
全篇使用.NET Core 3.0。既然是学新东西,我们就要跟上时代。另一个原因就是使用.NET Core可以不用装那么多那么大的东西。我们基本上只需要装SDK和编辑器就行了。
.NET Core的准备
在这里下载最新版本的SDK(点击Build Apps后面的按钮以确保下载的是SDK而不是运行时)并安装。
.NET Core是有一个命令行界面的,很多操作十分方便。安装完成后打开Windows Powershell(9102年了,和Cmd说再见好不好)或者终端。输入dotnet -v,查看是否能够正常执行该命令并显示相关信息。
大部分时候在各个操作系统上的输出应当都是一样的(你安装时的版本号可能变了),因此除非额外指出,同样的操作在各个操作系统上都应当得到一样的结果(或者不影响正确性的前提下类似的结果)。
如果你看到了这些信息,那么安装应该是没有问题的了。
编辑器的准备
为了能够快速起步,而不是花大把时间在装东西上,装完东西说不定你就觉得,啊,今天我学了好多东西,好累,该打游戏了!因此我这里不推荐装Visual Studio。当然VS确实是非常牛逼的IDE,并且和C#一样作为微软自家的产品,对C#的支持是非常不错的。但是因为VS是一款全功能的IDE,功能非常强大,东西也很多,但是我们着重是学习C#,所以难免显得大材小用而且下载依赖项很浪费时间。当然,你如果觉得你有那个时间也不会半途而废那么也可以去安装,或者说已经安装了,也可以使用VS,没有问题。
这里主要推荐Visual Studio Code。安装时记得把添加到PATH勾上。如果你能看明白可以先参考这里配置一下。它是微软的一个开源跨平台编辑器。 (这里不得不插播一句,编译器、编辑器、IDE是完全不同的概念,希望大家一开始都分清楚这些东西,尽管目前看来编辑器和IDE的界限在趋于模糊。) 好看又好用,搭配C#的插件,开发体验也是相当不错的。如果你已经有其他的编辑器了,也不一定要装这个,可以看看相关插件即可。
Hello, world
久 等 了
本篇以万众期待的Hello, world结尾。无论你是不是程序员,可能都对这句话有所耳闻。这是一个惯例,当一门新的语言诞生时,以这种方式来发出第一声问候,也是很多教学过程中的第一个程序。还有就是,通过这种方式来检查整个工具链,甚至于说,你的屏幕,有没有问题。
在Powershell或者终端中输入以下命令
dotnet new console -n “HelloWorld”
如果看到输出的一大堆字最后有一行Restore succeeded,那么一般情况下就表示正常创建了项目。 完成后当前目录下会出现一个HelloWorld文件夹。这就是.NET CLI为你创建的一个控制台应用程序项目。 new参数表示创建新项目,console代表项目类型是控制台类型,在整个教程中我们可能大部分时候都是使用console选项。最后是项目名称,不指定输出目录则创建以项目名称为名的文件夹。
打开文件夹,我们先看一眼csproj文件,它是一个项目文件。微软的很多开发工具都会利用这样的项目文件来配置项目,以便相关构建工具能够正确构建项目。比如说我们可以在里面配置目标框架版本、使用的编程语言版本等等。
使用cd命令进入到HelloWorld目录中(cd HelloWorld,对,不管哪个平台都是这样)。使用dotnet run命令,构建项目并运行。
正常情况下,你会看到控制台中输出了Hello World!字样。
在当前目录下,使用code .命令在VS Code中打开当前目录。(如果你发现提示找不到code命令,那么你需要搜索一下如何将VS Code添加到路径)打开Program.cs,这就是我们的源文件,这是默认生成的一段代码,就是这段代码在经过了整个.NET Core的各部分分工合作之后,成功地在控制台输出了我们想看到的HelloWorld。我们的编程之旅就从这里开始。
Hello, world程序的源代码
下一篇文章,我们从Hello, world开始,分析并学习这个最简单的C#程序。
学习令人激动,但要戒骄戒躁
目录