gpt4 book ai didi

C# 7.3+ ref 变量的预期行为?

转载 作者:行者123 更新时间:2023-12-05 00:07:16 24 4
gpt4 key购买 nike

我刚刚遇到了一种情况,归结为:

        private static uint[] intArray;

private static void Main(string[] args)
{
intArray = new uint[10];

for(var i = 0u; i < intArray.Length; i++)
{
intArray[i] = i;
}

ref var value = ref intArray[4];

Array.Resize(ref intArray, 100);

value += 10; // what are we modifying here? The old memory?

Console.WriteLine(intArray[4]); // prints 4 not 14 because the array is resized
}

这是 C# 中 ref 变量的预期行为吗?

最佳答案

是的,这是意料之中的。 Array.Resize()不会从字面上调整数组的大小,它不能,数组是连续的内存。它所做的是创建一个具有所需大小的新数组,并将旧数组中的值复制到其中。如此处所述:https://docs.microsoft.com/en-us/dotnet/api/system.array.resize?view=netframework-4.8

你在评论里也有问题:“我们在这里修改什么?旧内存?”是的,虽然您无法访问旧数组,但仍然有您对其中元素的引用,因此 GC 无法删除它,直到 value超出范围。所以更新内容没有错误。
int是值类型,因此该值被复制到新数组中。如果你有一个 Object 的数组引用的值将被复制,您仍然可以通过变量访问它 value .

关于C# 7.3+ ref 变量的预期行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59520987/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com