繁体   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