额,这个问题又火了,但是我已经渡过了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分钟。


这样是不对的。

计算机编程学习,分为三个阶段:第一阶段是学习语法;第二阶段是学习语法的运用;第三阶段是学习所必需的技术原理。

在学习语法的阶段,不要死记硬背,而是通过一些简单的应用来学习。然后,逐渐进入到比较复杂的应用场景中学习,根据需要学习一些必需的技术原理。

所以,题主所展示的教程是不妥的,知识点太多了,新手接受不了,很多学习编程的人,往往就死在学习语法这一阶段。根本就不需要讲这么详细,给一个框架,让学生模仿就够了。

学习编程是有一个套路的:第1步讲数据的概念(数量和字元),第2步从数据延伸到数据类型,第3步从数据类型延伸到变数和常量,第4步运算符,第5步表达式,第6步程序结构,第7步数组和字元串,第8步函数和参数,第9步指针或引用类型,第10步类与对象,第11步文件操作,第12步人机交互(命令行或图形界面),以后就是专项,比如网路、资料库、进程、线程、内核、项目组成、设计模式、虚拟机等等。

所以,入门的时候就根本就不能这么讲、这么学。一个例子,就只能讲1、2个知识点,少即是多。即使在例子中用到了许多知识点,也是存而不论,而是前后的例子风格保持一致,让学生模仿就可以了,接触多了,自然就会了。


从发展历程看,可以理解为C-&>C++-&>Java-&>C#,所以入门C直接跳到入门C#是比较难的,中间缺了很多概念……

我不知道你是怎么学C的,但我学编程的做法是,不去管那些using、namespace、class的概念,先把这些不理解的东西看作必须这么写的,让代码能跑了先

等到遇上和之前的东西相似而又不完全相同,比如class HelloWorld和class Helper,再去研究这个是什么意思。

研究透基本概念再写代码的做法也不是不行,但既然你都尝试几个小时了,我觉得这种方法不适合你(没恶意,也不适合我)。

不然的话别指望几个小时学C#了,从pe格式、.net的assemble、CLR、C#完整语法、编译过程这些开始讲起,怕是一年都学不会。

另外我是不赞同从图形化起步的……刚入门一门语言,连基本语法、数据结构都还没学会,就想著从GUI部件对应的自动生成代码来学习?


前大学编程课讲师来试著解答一下吧。

编程实际上等同于你制定一个计划,并且开始干。

例如你想学的输出hello world,实际上等同于你想在纸上写出hello world。

1. using部分

首先第一行的using system,一般在编程的时候都要写一堆using,目的在于你要告诉执行计划的人,你需要使用什么道具。例如钢笔还是铅笔,还是彩喷。钢笔、铅笔归类于笔,彩喷归类于颜料。如果不清楚想用什么工具想让他们都拿过来,之后实际用的时候再考虑,那么就可以写

using 笔

using 颜料。

写完后,电脑就会给你准备一个笔的大工具盒,里面除了钢笔铅笔外还有圆珠笔等,也会给你准备一个颜料箱,里面不仅有彩喷,还会有其他东西。

2. namespace以及class

namespace等同于计划的文件夹,例如你写namespace A,那么意味著你给计划起了一个叫A的名字。

之后再声明class,这叫类,你可以理解为在文件夹下面放的文件模版。

举例来说前面提到的笔和铅笔的概念,其中笔就是一个namespace,铅笔就是一个class。而这个class有多种用法,今天你只要了解一种就好了

命名空间和class写的时候都要用大括弧圈定好范围。

3. 函数。函数就等同于你写的具体计划。在class里面可以有很多的计划,方便交给不同的人去执行。

而主函数只会有一个,就是main的那一行,那个是固定写法,那么写的就是主函数

主函数是执行计划的起点,毕竟你写了一大堆计划,肯定要有个启动点,而主函数就是启动点。

然后在主函数里面一条一条的执行。

在主函数里面写上console.writeline就是固定的输出语句,你可以当做是个铅笔,在小括弧里面写上你想输出的话。

而console这个铅笔,就是system这个笔箱里的一根铅笔里的。如果你不在写using system,那么你在这里就用不了console这个铅笔。

先讲这么多,你先了解个概念和大概,讲多了估计你会懵了


推荐阅读:
相关文章