我們先定義一些區域性變數

2022-04-04 12:51:24 字數 1249 閱讀 1820

static

void main(string args)

這段看似和c++一模一樣的區域性變數定義**,其實內部執行的方式有很大的差異。這些int, double不再是以往簡單的內建型別,而是c#資料型別的別名。

我們看一下cts規定的,也就是c#所遵循的系統型別層次結構。

如圖所示c#語言是單根的。也就是說所有的型別都整合於乙個類,這個類叫做system.object。所有直接繼承於system.object的類,都叫做引用型別。所有繼承於valuetype,並間接繼承於system.object叫做值型別。我們剛才所用的這些型別都是值型別。在圖上藍色表示。

前面說過,c#很注重命名規範,所以這些值型別其實都有他們的「大名」。bool其實叫system.boolean,int其實叫system.int32。你看,他們都屬於system的命名空間,而且型別的首字母都是大寫。不過實際上,大家都喜歡用他們的「小名」,bool, int來稱呼他們,這樣會感覺更親切一些。

那麼值型別和引用型別到底有什麼區別呢。我們學c++的都知道,系統執行起來後,變數都儲存在記憶體中。普通的區域性變數儲存在叫做「棧」的記憶體塊中,通過遇到出棧的操作,系統可以自動維護區域性變數的生命週期。而我們new出來的變數都儲存在「堆」中,建立在「堆」中的記憶體塊只能通過我們自己來釋放,所以一再強調有new必然要有對應的delete。

在c#中的定義是這樣的:所有的值型別都儲存在棧中,所有的引用型別都儲存在堆中。也就是說,我們剛才定義的int, double,因為他們都是值型別,儲存在棧中,所以他們都會在函式結束的時候被系統自動釋放掉。而如果我們申明乙個字串或者陣列,因為他們是引用型別,儲存在堆中,所以函式結束的時候並不會自動釋放。而是等待delete被釋放。

我們再來搞一下腦子。有這樣一段**

double d = new

double();

1)這段**可行麼?2)函式結束時d變數是否還存在在記憶體中?

首先,這段**是可行的!double是system.double型別的簡稱,new這樣乙個型別肯定沒問題(*注意,c++中只能寫成new double, 後面的括號只有在構在函式需要引數的時候才要加上。)

其次,d變數在函式結束時會被自動銷毀。雖然它看起來是用了new,但是由於它是值型別,而值型別是儲存在棧中的,所以即使看著奇怪,他仍然會被退棧。

值型別引用型別是cts的根基,很重要!好了,今天就說到這裡。

Java使用區域性變數的一些要點

5.盡量使用區域性變數 呼叫方法時傳遞的引數以及在呼叫中建立的臨時變數都儲存在棧 stack 中,速度較快。其他變數,如靜態變數 例項變數等,都在堆 heap 中建立,速度較慢。6.盡量處理好包裝型別和基本型別兩者的使用場所 雖然包裝型別和基本型別在使用過程中是可以相互轉換,但它們兩者所產生的記憶體...

C 關於區域性變數的一些理解

最近在糾結乙個問題,把區域性變數加入到乙個全域性的鍊錶裡面去,在其他的地方獲取到這個變數值是否存在?區域性變數不是應該釋放了嗎?我個人有如下理解 其實不然,加入到鍊錶的時候其實是把變數的值複製乙份加到鍊錶裡面去的,區域性變數所申請的位址是釋放,如果變數是乙個類物件就會把這個類物件的值賦值到鍊錶裡面新...

關於全域性變數,區域性變數的一些看法!!!

1,全域性變數,和區域性變數的生存週期咋樣呢,儲存位置呢?2,假如全域性變數和區域性變數定義賦值都是一樣的,那麼printf函式裡呼叫變數會出現什麼結果?把區域性變數去掉呢?3,對於乙個c c 程式而言,全域性變數真的只是定義在所有函式之外就ok的嗎?假如某乙個全域性變數定義在最底部,那麼上面的那些...