[英]Does declaration in c# allocate memory or is it the new operator that allocates memory?
[英]Do C# reference types allocates new memory when passed to methods?
大家......我是C#和其他語言的新手......
我讀過Skeet的兩篇文章,一篇關於堆/堆棧 ,另一篇關於引用類型和值類型 。 而且我認為我的問題很簡單,但在閱讀這些文章后我並未澄清。
傳遞給方法時引用類型是否分配新內存?
例如,如果我將表單傳遞給方法,例如
void myMethod(System.Windows.Forms.Form myForm)
{
...
}
是否會分配更多的內存來存儲所有myForm
數據,還是僅僅包含對myForm
數據已分配位置的引用?
我擔心的是,如果分配更多的內存來存儲“附加”到myForm
所有內容,很快內存就會變滿,如果myForm
是一個很大的形式......
實例化原始表單時,表單對象將在堆上分配。 當您調用myMethod時,您將按值傳遞引用類型(本質上是指向該對象的指針)。 這意味着您傳入的引用將在myMethod的上下文中復制 - 這涉及32/64位堆棧分配,具體取決於您的體系結構。
因此,要回答您的問題,您的表單將不會被復制,但對其的引用將是。
免責聲明:我很久沒有使用過C#了。
從技術上講,它們將創建引用的副本(因此另一個“引用大小的”內存分配),但引用的實際對象將不會被復制和重新分配。
將Form
引用傳遞給函數並不比傳遞整數更昂貴。
Form
是一個大對象(當你添加所有東西時可能是幾十KB)。 只有對它的引用才能作為參數傳遞。 此引用僅為4個字節(在32位進程中),並在方法返回時消失。
不,僅分配參考。
在C#中,引用類型的實例只能通過引用傳遞。 也就是說,對象本身永遠不會被復制,只有對它的引用。
嚴格地說,當您將對象傳遞給方法時,其引用將按值傳遞。 這意味着,您可以使用此引用訪問該對象,並且您對該對象所做的更改將對調用您的方法的代碼可見,但是,如果您將該接收的引用指向某個其他對象,則該更改不會影響為您提供原始引用的代碼 - 因為引用是按值傳遞的。
與值類型相反,當按值傳遞時,會復制。
表格是一個類。 在C#中,一個類是一個引用類型 - 這意味着當它傳遞時它通過引用傳遞。 這基本上意味着Form實例所在的內存地址被傳遞到堆棧幀而不是復制所有字節。
如果方法參數是struct或類似int的基本類型,那么它將是值類型。 傳遞給方法時,值類型將其所有數據復制到方法的堆棧幀中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.