我能否保证非 ref 方法不会更改数组大小 C#

  • 本文关键字:数组 方法 ref c# arrays
  • 更新时间 :
  • 英文 :


另请参见:

  • 更改数组大小
  • 在程序的稍后在C#中调整大小数组

这两个问题都不同,因为他们询问您将如何更改大小,我很清楚答案是:"不要...使用列表"。他们还引用了基于参考的Array.Resize(ref array, int size)

我的问题是:

鉴于我有一个单片的旧代码库,我无法检查整个,也不能保证它的所作所为,...如果我呼叫的方法不逐个传递参考阵列,我可以保证以后的数组的大小不变。

array.resize不是问题,因为by-ref-ness必须一直通过呼叫堆栈,显然不是。

但是还有其他可能的问题吗?

说明不重复

我认为这与其他问题不同,因为这是"有可能的?"而不是"我该怎么做/最好的做法是什么"。因此,将是邪恶与错的答案,而后者不会被提及,仍然与我的问题有关。

我可以保证以后的数组的大小没有变化。

是的,因为数组从不更改大小。曾经。Array.Resize创建数组并复制数据;它做不是实际调整了任何大小。如果您对旧数组有参考,那么:您很好,大小不变。

不可能更改大小。

  1. 托管阵列永远不会改变大小:

C#中的数组是"托管数组",该数组由GC分配在托管堆上。在托管的C 中,您会写[1]:

array<N*>^ arr = gcnew array<N*>(3);

这是一个单一的原子对象,从托管堆的角度来看,它不能调整大小,只使用并最终收集垃圾。托管C [2]中没有gcresizegc-re-new操作员,因为CLR中禁止使用。如果托管对象在其一生中大小变化,则将显着使托管的GC复杂化。我找不到有关此断言的确定文件,但我很自信。

您可能会询问" Array.Resize"方法的工作方式,如果数组的大小永远不会变化。正如文档所解释的那样:

此方法分配了一个具有指定大小的新数组,从旧数组到新数组的副本元素,然后用新数组替换旧数组。

然后,Array.Resize方法更新数组键入变量以指向新数组(因为变量是通过ref通过的),并允许旧数组被gc'ed(除非有另一个参考文献)。

  1. c#中的方法参数是通过val的

...因此,如果您不使用任何其他by-ref方法,没有人可以更新您的数组键入变量以指向其他数组。

我相信1和2一起回答您的问题。

这与列表有何不同?

List可以不使用BY-REF方法变化。那有些不同。列表对象本身位于托管堆上,从不改变大小,但它包含一个指向数组作为成员变量的指针。当List生长时,该指针会更新以指向包含新元素的较长数组。

最新更新