- 哪裏存儲在存儲器中即堆棧或堆以及對象EMP?
這個問題措辭不佳。 emp
不是對象; emp
是變量,其中包含對象的參考。
讓我們改寫了一個問題:
1(a)如果是通過對象提到emp
存儲在內存?
變量emp
所指的對象被存儲在長期存儲中,也被稱爲「堆」。
1(b)emp
是一個變量,因此代表一個存儲位置。內存中的存儲位置在哪裏?
這個問題沒有給出足夠的信息來說。變量emp
可能是一個靜態字段,實例字段或局部變量。 (由於分號,它不能是一個形式參數。)如果是本地的,它也可能是一個lambda的封閉外部變量,或迭代器塊的本地或異步方法。所有這些都會改變變量的存儲是在短期還是長期存儲。如果是短期存儲,它可能在堆棧中,或者它可能是一個寄存器。
2哪裏有name
和age
變量存儲在內存中怎麼樣?
由於它們是類的字段,因此與這些變量關聯的存儲位置總是處於長期堆中。
由於name
的類型是string
,它所指的東西 - 字符串 - 也在堆上。 (或者,變量可以爲空,在這種情況下,它並不是指什麼。)
3是什麼在這個聲明中的每個單詞做即哪些呢員工do..then emp..then =。那麼新的..然後員工..然後()..然後;
這個問題措辭極爲糟糕。首先,這些不是「單詞」,而是「代幣」。 (並且()
是兩個令牌。)第二,完全不清楚「做」這個問題的含義。所以我們來問一個不同的問題:
3詳細描述在運行時執行此聲明時執行的操作。
由於問題中沒有足夠的信息,我們不能以任何精度來說。問題說這是一個聲明,所以它不是一個字段聲明。爲簡單起見,假設它不在迭代器塊或異步方法中,並且本地不是任何匿名函數的外部變量。
首先,爲變量分配短期存儲;它很可能會被註冊;如果沒有,它將在堆棧上。它被分配一個空引用。
其次,要求內存分配程序爲堆中的Employee實例生成空內存。它這樣做併產生對該內存的引用。第三,如果這是我們第一次看到Employee和Employee有一個靜態構造函數,那麼靜態構造函數就會運行。
四,靜態ctor完成後,Employee的字段初始值設定項運行。
五,員工的基類構造函數運行。這可能會導致其他靜態構造函數執行。
六,員工的構造函數體運行。
第七,構造函數完成,並且對現在初始化的對象的引用被複制到它的存儲中。
所有這些當然都假定沿途沒有任何東西拋出異常。
4以上聲明和Employee emp;
有什麼區別?根據內存分配進行講解。
該問題未包含足夠的信息,以提供準確的答案。如果從不使用局部變量,那麼編譯器可以自由地優化它。如果它沒有優化它,那麼emp
的存儲將從短期池中分配,初始化爲空,並且從不使用。
我會提供提示和指針,但我不打算爲你的作業寫一行代碼。 – 2013-03-20 10:04:45
看看這個:http://www.red-gate.com/community/books/under-the-hood-dotnet-memory-management有一個免費的PDF版本,你可以下載。 – 2013-03-20 10:06:58
另一個非常好的資源是'CLR通過C#,第四版'http://shop.oreilly.com/product/0790145353665.do值得購買。 – 2013-03-20 10:07:45