簡體   English   中英

C#引用類型在傳遞給方法時是否分配新內存?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM