今天上網搜尋c++的命名空間,是想看c++的命名空間是不是開放的,我隨時可以往其中新增內容,無意中搜尋到了一片比較c++、java、C#命名空間的文章,後來發現還被很多人轉載了,在這裡,我表示壓力很大,因為那一篇文章純粹亂忽悠,卻能被很多人轉載,所以深切感覺到網上有技術含量的技術部落格太少了,大多都是複製粘貼充門面,對於他們對部落格業發現的貢獻,我表示膜拜,但對於他們對技術的褻瀆,我表示鄙視一下。
貼出他們的論點,僅貼出來而已,不討論了,只是作為證明我上面第一段的話是有根據的,至於他們觀點的荒唐之處,就不說了,因為編程的應該都能看懂,所以我給原文作者留言是:大哥,你不是編程的吧。
| |
支援泛型 |
引用簡潔 |
主體簡潔 |
優劣比較 |
C++ |
+1 |
+1 |
-1 |
9 |
Java |
-1 |
+1 |
-1 |
8 |
C# |
-1 |
-1 |
+1 |
8 |
部落格地址:http://blog.csdn.net/zade/article/details/610675
下面我來說我自己對這東西的比較:
- 出現命名空間的出發點:
C++ 為瞭解決重名衝突。決定了他不支援存取權限控制
C# 為了更好的封裝,有internal關鍵字與其對應
Java 同一個package下面,protected修飾的元素可被同package下的別的class訪問。Friendly,也就是預設default,說通俗點就是類成員之前不寫存取修飾詞,此時同protected,可以被同包下面的別的類訪問。
- 命名空間是否是開放的,即我在一個地方定義了一個命名空間,後來我在別的地方發現我想往其中增加內容,是否可以隨時隨地增加。
C++ 是的,你在一個a.h中定義了namespace MM{},此時在b.h中同樣可以namespace mm{},編譯器自己會負責將其合并到一起。
C# 這個就不用說了,絕對可以
Java 不可以,java的包是對應物理檔案的,此時顯得那麼像C++的.h檔案。
- 命名空間是否是抽象的,雷同第二點。第二點搞清楚了也就知道這個結果了。
- 是否參與代碼結構組織:
C++ 無,C++的編譯是首先編譯cpp,根據include去引入.h,其中c++的結構其實就是.h是怎麼組織的。命名空間僅僅為瞭解決重名,暫時沒發現沒別的用處
Java 參與了,java的命名空間也就是package可是和物理檔案直接掛鈎的,又怎麼可能不參與組織圖呢
C# 參與了,不過不是明目張胆的參與,而是抽象層面參與。物理檔案怎麼放,對於c#程式員來說基本沒概念,所以c#程式員可以根據愛好,建立一大堆檔案夾,然後分門別類放代碼檔案,java的程式員就不敢。因為C#是載入進來之後,由CLR層級的東西在幹那些程式集組織的事情。
也就這麼多了,至於上面個表格,就當空氣吧,我不知道import io.*的文法比 using namespace std;和using System.Draw;之類的複雜多少。也不清楚 package MM;比namespace MM{}這個簡潔多少。對於程式員來說,會覺得這個簡潔複雜也是問題的話,我覺得可以不用編程了,那多煩啊,豈不複雜死了。
我也不知道我其中有沒有說錯或者說漏了的地方,希望大家補充和糾正。