2017-02-27 103 views
1

我最近在採訪中詢問了實際變量的存儲位置。 我回答價值類型變量存儲在堆棧和引用類型變量存儲在堆,但面試官要求我給一個程序實時情況。請檢查下面的程序,並幫助我在哪裏存儲值類型和誰去參考存儲type.If你可以給例如與程序這將是非常有益的或讓我知道的任何工具,我可以在VS檢查這些地方越來越存儲值類型和引用類型實時內存分配

class Program 
{ 
    int i = 5; 
    bool a; 
    string str = "Stack Overflow"; 
    object obj = "object"; 
    string employeeName; 
    int employeeCode; 

    public int Add(int x,int y) 
    { 
     float a = 7.0F; 
     return x + y; 
    } 


    static void Main(string[] args) 
    { 
     Program obj = new Program(); 
     obj.employeeCode = 1000; 
     obj.employeeName = "John"; 
     int result = obj.Add(10, 15); 
    } 
} 

請讓我知道這些變量是存儲任何爲什麼。給出值類型和參考類型的一些例子

+0

'值類型變量存儲在堆棧和引用類型變量存儲在Heap' - 這是在C#中最大的誤區之一語言。請參閱[this](http://jonskeet.uk/csharp/memory.html)文章,瞭解這個令人困惑的主題。 – RBT

+0

一個非常密切相關的帖子[這裏](https://stackoverflow.com/q/3542083/465053)。 – RBT

回答

3

以下是引擎蓋下發生了什麼的概述。我可以提供的最好的例子是一系列具有Stack和Heap表示的圖形。

首先,我們假設我們有2個職業:士兵和軍官。軍官延伸士兵。另外,我們在method1中有一些邏輯。當方法1的執行開始時,我們有一些堆棧和堆的狀態。 Stack有一些來自以前的執行,現在不重要,Heap有我們的類定義。

Initial state

1)在方法1的開始,我們有一對夫婦的聲明語句,以使兩個變量將被推入堆棧小號年齡。眼下小號沒有任何指向和年齡 == 0,

enter image description here

2)S =新主任()語句堆創建新的對象,這個對象的地址現在是分配給š

enter image description here

3)讓我們想象一下小號oldier.Lookup(name)是Soldier類中的一個靜態方法。例如,它查詢數據庫並生成新的主管對象。因此,指針將指向一個新的對象,而前一個對象是垃圾收集的候選對象。

Static method call

4)下面的語句是隻是一個賦值。 年齡現在是31(31是GetSoldierAge()操作的結果)。

Simple assignment

5)s.CurrentStatusReport()有一定的副作用(打印報告),並不會影響我們的記憶,所以我們就忽略它。下一條語句是sendOutForTraining(age,s)方法的調用,這裏有很多樂趣:)

值/參考。有趣的部分。

6)當執行進入sendOutForTraining(年齡,S)會發生以下情況:

  • 指針sendOutForTraining被壓入堆棧(用於返回目的)。

  • 變量a被創建並推入堆棧。將年齡段的值立即複製到a中。

  • 變量sldr被創建並推入堆棧。從小號指針被複制到SLDR現在小號SLDR都指向同一個對象。

entering sendOutForTraining

進入sendOutForTraining

7)的+ = 2的結果被計算並存儲在堆棧中。如您所見,年齡a是不同的變量並且包含不同的值。

a assignment

8)好的,sldr.age =一個。應該清楚,此操作的結果將影響指向sldr指向的共享對象。所以這個方法之外的年齡應該是相等的。

age changing

9)的另一種分配。 sldr =新士兵();結果是一個全新的對象,其地址現存儲在sldr內。從外部變量的方法不知道它,絕對不在乎。

New object created

10)最後的語句只是將改變SLDR地址下的對象的實例字段。

Change age of another object

11)方法執行結束,當任務完成所有文物應清洗。未使用的變量將被銷燬並且對象將被垃圾收集。

Cleaning artifacts

12)我們可以看到,sedOutForTraining一直生活的標誌。官對象的實例變量它的年齡= 33

The final state