也可以看看:
这两个问题都有所不同,因为他们会问你如何改变尺寸,我很清楚答案是:"不要......使用清单".他们还引用了基于ref的Array.Resize(ref array, int size).
我的问题是:
鉴于我有一个单片遗留代码库,我不可能检查整个代码库,并且无法保证它的作用,...如果我有一个非-re-ref数组中的调用方法传递,我可以保证之后数组的大小不变.
Array.Resize不是一个问题,因为by-ref-ness必须通过调用堆栈一直向上传递,显然它没有.
但是还有其他可能的问题吗?
备注不是重复
我认为这是与其他人不同的问题,因为这是"有可能吗?" 而不是"我怎么做/什么是最好的方式".因此,答案将是邪恶和错误的,后者将不会提及,仍然与我的问题相关.
Mar*_*ell 20
我可以保证之后数组的大小不变.
是的,因为数组永远不会改变大小.永远.Array.Resize创建一个新数组并复制数据; 它实际上并没有调整任何大小.如果你有一个旧数组的引用,那么:你很好,大小不变.
数组的大小不可能改变。
C#中的数组是“托管数组”,由GC在托管堆上分配。在托管 C++ 中,您可以编写[1]:
array<N*>^ arr = gcnew array<N*>(3);
Run Code Online (Sandbox Code Playgroud)
从托管堆的角度来看,这是一个原子对象,它不能调整大小,只能使用并最终被垃圾收集。托管 C++ [2]中没有gcresizeor运算符,因为这在 CLR 中是被禁止的。如果托管对象的大小在其生命周期内发生变化,那么托管 GC 将会变得非常复杂。我还没有找到这个断言的明确文档引用,但我相当有信心。gc-re-new
您可能会问Array.Resize,如果数组的大小从不改变,“ ”方法如何工作。正如文档所解释的:
该方法分配一个指定大小的新数组,将旧数组中的元素复制到新数组,然后用新数组替换旧数组。
然后,该Array.Resize方法更新数组类型变量以指向新数组(因为该变量是按引用传递的),并允许对旧数组进行 GC(除非有另一个引用)。
...因此,如果您不使用任何其他 by-ref 方法,则没有人可以更新您的数组类型变量以指向不同的数组。
我相信1和2一起回答了你的问题。
AList可以更改大小,无需使用 by-ref 方法。那有点不同。List 对象本身位于托管堆上,并且大小永远不会改变,但它包含一个指向数组的指针作为成员变量。当List增长时,该指针将更新为指向包含新元素的更长数组。