C#是為了填java的坑,java是填C++的坑,C++的坑來自於C。我自己因為這些都用過,所以在概念的理解上沒有什麼障礙。粗略來講:
名稱空間是為了避免C語言這種“平坦”名稱空間的各種重名引入的。
介面不允許帶有資料成員,只允許帶(虛)方法。本質上是為了減少C++多重(虛)繼承的複雜度引入的。這樣可以在單繼承的呆板和多繼承的複雜度之間取折中。
委託本質是一個普通的類,只是編譯器會為你做程式碼生成,減少你打字的量,可算得上是填了Java的一些坑,用C打比方就是某種型別安全的函式指標。類似的還有async, await, event之類的關鍵字,即便沒有這些你也可以寫出完全等價的程式碼,比如java一層套一層的內部類。
列舉一般是用整數實現,一般只用於相等性或者bitfield的比較,從C時代就有,但是C的enum可以當成整數任意做運算,C++/C#加嚴了一些限制。禁止了數值運算。
類和結構不需要懂,現在的你估計也懂不了,這涉及到棧和堆,C#的物件模型,box/unbox開銷,與native語言做interop等等(類似的設計可以在Dlang裡見到,又是一個填java坑的設計)。一般情況下一律用class即可。
其實,我不知道新人要如何在不通曉歷史背景的情況下,理解一個程式語言的設計理念。或許這需要某種“不求甚解的能力”( @陳碩語),也就是,你先靠直覺把程式碼寫起來,積累經驗和感覺,等到你某一天覺得,“哎呀,這裡要是有一個XXX之類的功能好了”,然後在C#的語言特性裡找到的時候,你自然就懂了。
想了想,就是因為我缺乏這種能力,當年在知乎提問說為什麼C#的語言那麼難懂的時候,遇到的答主普遍都是一臉高冷地用這張圖糊臉的,逼乎果然還是不適合萌新啊。
C#是為了填java的坑,java是填C++的坑,C++的坑來自於C。我自己因為這些都用過,所以在概念的理解上沒有什麼障礙。粗略來講:
名稱空間是為了避免C語言這種“平坦”名稱空間的各種重名引入的。
介面不允許帶有資料成員,只允許帶(虛)方法。本質上是為了減少C++多重(虛)繼承的複雜度引入的。這樣可以在單繼承的呆板和多繼承的複雜度之間取折中。
委託本質是一個普通的類,只是編譯器會為你做程式碼生成,減少你打字的量,可算得上是填了Java的一些坑,用C打比方就是某種型別安全的函式指標。類似的還有async, await, event之類的關鍵字,即便沒有這些你也可以寫出完全等價的程式碼,比如java一層套一層的內部類。
列舉一般是用整數實現,一般只用於相等性或者bitfield的比較,從C時代就有,但是C的enum可以當成整數任意做運算,C++/C#加嚴了一些限制。禁止了數值運算。
類和結構不需要懂,現在的你估計也懂不了,這涉及到棧和堆,C#的物件模型,box/unbox開銷,與native語言做interop等等(類似的設計可以在Dlang裡見到,又是一個填java坑的設計)。一般情況下一律用class即可。
其實,我不知道新人要如何在不通曉歷史背景的情況下,理解一個程式語言的設計理念。或許這需要某種“不求甚解的能力”( @陳碩語),也就是,你先靠直覺把程式碼寫起來,積累經驗和感覺,等到你某一天覺得,“哎呀,這裡要是有一個XXX之類的功能好了”,然後在C#的語言特性裡找到的時候,你自然就懂了。
想了想,就是因為我缺乏這種能力,當年在知乎提問說為什麼C#的語言那麼難懂的時候,遇到的答主普遍都是一臉高冷地用這張圖糊臉的,逼乎果然還是不適合萌新啊。