学了几个小时的 C#,连 hello world 都不会写,怎么通俗地解释这些部件都是干什么的?
额,这个问题又火了,但是我已经渡过了helloworld都不会的阶段了。大家给新人点建议就好,不用管我了(●?●)??
越通俗越好,比如我给我的高中小伙伴讲 C 语言的时候是用一车砖盖楼来做比喻的
当然,不一定需要比喻,直接解释我也听得懂,学过一点 C 语言(大学生入门水平)
我从下面这个学的
有C语言基础就好说了。
学编程呢,你最好有个「划界」思想:这块是我的,那块是别人提供的(库/框架),第三块是编译器的地盘……
如果搞不懂,那么首先你要学会寻找哪些是你自己的地盘——然后,你完全可以强凹著拿它当C玩。
先把自己地盘的东西搞明白,然后再逐步补充新鲜知识,慢慢把独属于C#的也变成自己的,自然就学会了。
事实上,只要你按这个顺序来,很容易发现,这个C#和C没什么两样。
只不过,C是先#include &等一堆库,然后main;C#是using system,然后弄了个花里胡哨的main。
刚开始,你先别管那些花活,把main函数里面当成自己的地盘,是不是就和C一样了?
类似的,C是printf/puts,C#是Console.WriteLine——是不是还是一样一样?
先找熟悉感,学著把原本的C风格代码写成C#风格,你就会发现,其实都还是那点东西。
搞熟悉之后,我们再来看C#改变的以及多出来的东西。
过去,C时代,程序很简单,数据结构+演算法=程序。
到了C#时代,程序仍然是 数据结构+演算法;但它额外提供了一些东西,可以方便我们把自己的代码组织起来。
第一个东西叫「类」,写作 class 。
class和C的结构体(struct)差不多;只是class捆绑了操作自己的函数(现在叫方法),同时有了「访问权」约定。
说白了,C里面写 struct student{...} 定义一个存储学生信息的结构体;C#就写class student{...} 定义一个存储和操纵学生信息的类。
然后,我们要用 struct student stu;来声明一个结构体的实例;C#则用 student stu;声明一个类的实例。
C里面,我们这样操纵stu:先声明bool initStudent(stu * pStu),写好处理逻辑;然后调用initStudent(stu)。
C#里面,我们必须把这个initStudent写到class student里面——它既然就是操纵class student用的,当然写一块比较好。
然后,直接用这个格式执行stu.InitStudent()就好了(注意不需要手工传stu的地址了,编译器自动帮你把stu传进去)。
当然,C#里面,把操纵某个类的函数就放到它里面之后,就多了许多许可权约定。比如public是公开给其他类用的,private是只有sudent类自己内部用的——于是你就可以有意识的控制哪些允许在类外调用、哪些不允许了。这就叫封装性。
此外,还有个protect,那是给继承类用的。等你学的更深一些自然就明白了。
和C不同,C#要求一切代码都必须安排到某个类里面,不允许独立的函数存在。
这就造成了一个问题:main函数往哪放?
类是一个数据结构定义,一个定义显然是不能执行的。那么main函数岂不是没地方实例化、也没办法执行了吗?
C#就来了个约定:把main函数写到项目同名类里面,声明为静态函数。
静态函数是什么,你将来自然会学到。它的大概意思就是「这其实是个独立函数,编译器不会为它自动传入实例参数,因此只能操纵和它绑定的类里面的static变数」。
搞不懂也没关系,现在记住这个死格式就行。
不仅代码被C#给规范化了;就连库也被规范化了。它不再是C时代的#include那样,直接把一段源码插到你的程序前面;而是通过using声明,告诉编译器/解释器,我要用某某库。
不仅如此,它还提供了一个命名空间功能。不同人写的代码可以放进不同的命名空间,这样就不会相互冲突了。
事实上,c#的库全都放在各自的命名空间里;只要你用using告诉编译器/解释器,我要用这个命名空间的东西,它就会帮你安排到位。
命名空间的东西如何使用呢?
命名空间的名字.命名空间提供的类.要使用的方法——和C时代差不多,就是前面加个点,然后写上命名空间名字就行了。
前面提到的,「你的地盘」里的console.writeline,实质上就是调用[system命名空间的]console类的writeline方法——因为你前面已经声明了using sytem,因此console前面的system可以省略。
console是个很简单的英文单词,控制台的意思。顾名思义,console.writeline就是在控制台输出一行文字。
其实说白了,C#比起C,最主要的也就是多了这么点东西。大概知道就足够动手了。
当然,曲折隐晦的地方挺多,还有什么线程协程等等新鲜玩意儿,用多就知道了。
至于csc什么的,那东西其实就等于C语言的编译器(gcc、turbo c之类)。和C时代一样,想让命令行能够找到某个命令,你得保证它在PATH环境变数里面——这么多年了,还是换汤不换药。
归根结底,你要尽量确定哪些是你知道的,哪些是你不知道的;然后只动你知道的,主动学习你不知道的,自然很快就能上手。
说一点学习的方法。
其实对大部分人来说,刚入门的阶段不需要去管这些概念性的东西。
这并不是说这些东西不重要。只是在这个阶段,你脑海中有关C#的心智模型,其规模和结构是极其原始的,都是一些支离破碎的、相互间未建立起足够健壮联系的孤立概念。从系统性思维的角度来说,就是「并未形成足够构成系统的循环」。这样的状态,自然无法直观的看到它们是如何起作用的。这个时候如果强行去理解这些概念彼此间的联系和作用,多只能是通过「记忆」去强行记住,而不能通过其机制来真正地了解。
纠结这些概念(尤其是在自学死磕时)很容易陷到坑里。这里顺便提一下:其实这,也是很多在校大学生「一开始信心满满要好好学习,但翻开教材后纠结刚开始的一些概念就能纠结到最终放弃」的原因所在。
而随著学习的深入,心智模型会逐渐完善,概念自然而然的就会明白,而那些不容易理解的概念通过能直接生效的程序来理解也远比现在容易。一言蔽之,你能做的「有关程序本身的事情」多了,再回过头来理解,就事半功倍了。
以题目中「学习hello world怎么写」来说,只需要知道:
1、Console.WriteLine()是输出方法,参数是string类型。
2、string类型是由""包裹起来的。
3、Console.ReadKey()的作用是等待用户输入键值,在这里使用的原因是让程序停在这里,否则控制台窗体会一闪而过,看不见输出的结果。
4、Main方法是整个程序的入口,会从这里的第一行开始执行。
了解了这些,你就可以知道你用""包起来的任何字元都能显示在控制台上,已经学会怎么写"hello world"了。整个过程不需要5分钟。
这样是不对的。
计算机编程学习,分为三个阶段:第一阶段是学习语法;第二阶段是学习语法的运用;第三阶段是学习所必需的技术原理。