標籤:
引言:
雖然沒怎樣接觸過vb.net,但是大概對於vb6還是比較瞭解的。前者是從後者基礎上發展而來的。後來接觸了C#程式設計語言,起初沒有太關心她和vb.net有啥不同的地方,話說都是物件導向的,而且都是MS帝國的產品。一直覺得沒什麼區別,直到昨天的下午……我才發現這樣一個吊炸天的問題……原來vb.net她……竟然……
最近看一些部落格發現,也發一些vb6.0論壇,vb.net論壇等比較冷清,更多的人從過去的vb6.0和vb.net選擇轉向了C#……剛好也和我昨天的發現不謀而合。
下面是我的一點小小的發現,或許很多人會說這個沒什麼,而且是非常基礎的東西。有什麼必要拿出來講呢?恰恰就是這樣的一個基礎的東西引發了我的一連串思考……這件事兒還得從一個New字說起………
相關知識:
用New出來的對象在記憶體中的堆區,而直接用類名來定義的對象是在棧區。那麼什麼是堆棧呢?據我瞭解到的大概有兩個意思,
1、資料結構:在電腦領域,堆棧是一個不容忽視的概念,堆棧是兩種資料結構。堆棧都是一種資料項目按序排列的資料結構,只能在一端(稱為棧頂(top))對資料項目進行插入和刪除。
2、儲存區:在單片機應用中,堆棧是個特殊的儲存區,主要功能是暫時存放資料和地址,通常用來保護斷點和現場。要點:堆,列隊優先,先進先出。棧,先進後出(First-In/Last-Out)。
小結:
所以,相關知識中的所謂的堆棧就是指儲存區。對於堆棧作為儲存區,有個經典的比喻:棧就像是我們去飯店吃飯,吃完就走人不用收拾,自然有人替你收拾好(用完立即自動釋放)。堆區的東西,也就四我們new出來的東東,就需要我們自己來管了,就像是在自己家裡做飯吃,搞完還得記得自己清理垃圾(手動釋放記憶體資源)。不過還好現在都有垃圾處理機制了,長時間不用的話,會有專門的演算法來自動清理的。
關於具體什麼是堆和棧請參考部落格:《堆棧——詳細分析》
小實驗:關於vb.net和C#對於類的封裝性的一個測試,分別在兩種程式設計語言環境下建立了兩個一樣的解決方案:都是在form1中取訪問form2中的成員(均為public成員)。實驗的一些條件如下:
1、都在一個命名空間下,處於同一程式集中。
2、兩個解決方案的程式設計語言環境分別是:vs2013旗艦版中的vb.net環境和C#環境
3、被訪問的form2的成員均為Public關鍵字修飾
分了如下兩種情況進行的。
情況一:不執行個體化對象,直接存取。
1.1(vb.net環境下)
1.2(C#環境中)
結論:在vb.net編程環境中,不用執行個體化即可訪問其他的類中的Public、friend成員。在vb.net環境中form2即是類又是對象,因此可以對類的成員直接進行操作。C#中在不執行個體化的情況下,無法訪問同一程式集統一命名空間下的類中的任何成員。
情況二:執行個體化對象後再訪問。
1.1(vb.net)
1.2( C# 環境中)
結論:通過執行個體化出一個form2對象之後再訪問,無論是vb.net還是C#下,都可以在form1通過執行個體化出來的對象來訪問form2中的任意被public或者friend修飾的成員。
其他發現:
1、vb.net和C#的存取修飾詞對照圖(他們是一一對應的關係,其修飾的效果是一樣的只是單詞表示不一樣而已)
2、助記圖C#存取修飾詞
小結:
1、執行個體化一個對象操作有什麼好處?
參考答案:靈活、安全、隨時用隨時new,不需要佔用系統的寶貴記憶體空間。因為執行個體化出來的對象其實是相當於類的一個鏡像。從物件導向的角度來說:一個封裝好了的功能的代碼塊就可以作為一個類。但你不能直接用它,因為物件導向概念中是不允許隨便修改類的內容的,這就是物件導向的封裝性。要用你就要執行個體化。就像汽車這個類。你要用行,但你不能改了汽車的一些基本性質上的東西。比如你不能讓四個輪子變成只有兩個。你不能去掉方向盤。但是你不甘心啊,所以你執行個體化了,系統就給你一個類似於汽車鏡像一樣的汽車,他有了汽車通有的東西。你自己給他一個名字,以後你就可以隨意讓車開開停停,改改裝裝,你說我要加一排燈行,你可以加在你的執行個體上,但不要加到類上,因為你一加到類上了,別人執行個體化了的汽車也有一排的燈了,人家又不喜歡怎麼辦呢。
那麼細心的童鞋就會問了,那麼在vb.net中我們並沒有執行個體化對象,但是也可以訪問其他類的成員啊!?這樣豈不是更靈活?好了,這就是我想說的啦,這樣對於類來說,這樣的靈活帶來的代價是不安全的!而且是破壞了類的封裝性。
在vb.net中,即使沒有執行個體化也一直都存有form2對象,這樣是比較消耗系統資源的。而且在vb.net中我發現,在form對象執行個體化和定義其成員的時候預設是用friend來修飾的哦!
因為friend修飾,意味著在同一程式集中可以被同一程式集中任意其他的類來訪問。這樣的話,確實是挺省事兒不用執行個體化了,但是也是相當的不安全哦。一不小心人家就把你的車子給改造了,卸個螺絲,丟個胎啥的。那麼這個類不就完蛋了嗎?
總結:
雖然vb.net和C#都是MS帝國的產品,也都是完全物件導向的程式設計語言。但是從以上實驗資料來看,C#相對來說對於物件導向的支援更加嚴格一些,比如:區分大小寫,再比如:類的封裝性。這樣的話,C#相對就更加安全一些。而且,現在人們對於網路的需求的日益增大,使得C#程式設計語言的優勢愈發的明顯,她還具有運算子多載的功能,這將使得一些複雜的運算問題變得極為簡單,而且這是vb所不具有的。C#還支援跨平台,哇哦……太多的好處了!而且從一些資料和現象來看,MS帝國也是更多的傾向於C#這一邊,所以在大家對於vb.net和vb6.0的社區的冷清就一點也不奇怪了
vb.net和C#兩兄弟誰的封裝性更好?