簡體   English   中英

什么樣的內存語義管理c#中的數組賦值?

[英]What kind of memory semantics govern array assignment in c#?

給出以下內容: byte [] sData; 和一個聲明為private byte [] construct_command()的函數

如果我然后將construct_command()的結果分配給sData,那么sData只指向函數返回的內容,或者為內存中的sData分配一些空間,並將函數結果的內容復制到其中?

賦值將簡單地指定sData以引用construct_command返回的實例。 不會復制數據。

一般來說,CLR將世界分為兩類

  • 值類型:這是從System.ValueType派生的任何內容。 這些類型的值之間的分配按值發生,並且實質上導致位置之間的值的副本
  • 參考類型:其他任何東西。 這些類型的值之間的分配僅使位置引用存儲器中的不同對象。 不會復制值

數組是CLR中的引用類型,因此不會導致復制基礎值。

數組是引用類型,這意味着實際數組在堆上實例化(可能由construct_command()),並且該函數返回對數組的引用,並存儲在(局部變量)sData中。

所以這不是關於內存語義(返回值可能為null),而是關於引用類型的復制語義。 情況完全相同,例如:

StreamReader reader = System.IO.File.OpenText(filename);

更坦率地說:你根本不能在.Net中傳遞一個數組,你只能傳遞,復制和分配對數組的引用。

sData將指向函數返回的內容。 C#中的數組是引用類型,這意味着從另一個數組中分配一個數組只是復制引用而不是分配新數據。

假設sData是一個局部變量,它將存在於堆棧中,它將引用該方法返回的數組。 該方法不返回數組本身的內容,而是返回對數組的引用。

在.net中,數組是第一類對象,所有數組類型變量實際上都是引用。

Array是引用類型,因此僅復制引用。 沒有內容操縱。

sData將指向construct_command返回的數組。

雖然Rui的答案總體上很好,但我認為其中一部分是不正確的。 從堆棧內存分配數組然后通過引用訪問它是沒有意義的(非常不一致)。 如果這是真的,底層內存可以從傳遞引用的任何方法下面釋放。

我相信當Henk Holterman非常直接且毫不含糊地說:

數組是引用類型,這意味着實際數組在堆上實例化

感謝Henk的評論; 我認為這是一個關鍵部分,否則會被接受的答案所缺失(並且與之相矛盾)。

(我會回復評論,但我沒有足夠的回答,我認為重要的是要指出接受的答案對我來說這個問題在這里添加新評論。)也許管理員可以從答案中刪除對“局部變量的引用,它將存在於堆棧中”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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