vb.net和C#兩兄弟誰的封裝性更好?


引言:

  雖然沒怎樣接觸過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的社區的冷清就一點也不奇怪了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM