額,這個問題又火了,但是我已經渡過了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這個鉛筆。

先講這麼多,你先了解個概念和大概,講多了估計你會懵了


推薦閱讀:
相關文章