【问题标题】:Why changes is one array data changing the value of another array in C# [duplicate]为什么变化是一个数组数据在C#中改变另一个数组的值[重复]
【发布时间】:2019-10-06 17:17:02
【问题描述】:

为什么在改变 arr1[1] 的值时 arr[1] 的值会改变?同样,为什么((int[])o)[1] = 1000;

class Program
{
    static void Main(string[] args)
    {
        int[] arr = new int[2];
        arr[1] = 10;
        Object o = arr;
        int[] arr1 = (int[])o;
        arr1[1] = 100;
        Console.WriteLine(arr[1]);
        ((int[])o)[1] = 1000;
        Console.WriteLine(arr[1]);
    }
}

为什么答案是 100 和 1000?

此代码是来自https://www.techbeamers.com/csharp-coding-interview-questions-developers/的问题5

【问题讨论】:

    标签: c# arrays


    【解决方案1】:

    为什么在改变 arr1[1] 的值时 arr[1] 的值会改变?

    这是您的第一个问题,但在回答完第二个问题后现在保留它。

    同样为什么它在((int[])o)[1] = 1000;时发生变化

    这是你的第二个问题。 答案是查看o 变量的初始值。

    Object o = arr;
    

    上一行将o 设置为arr,但它并未将元素从arr 复制到o。它们是引用类型,因此,现在oarr 都指代same 内存块。因此,对arr 所做的任何更改都会影响o,反之亦然。因为它们共享相同的内存。

    现在,让我们回到你的第一个问题:

    真的和第二个答案一样。

    int[] arr1 = (int[])o;
    

    上一行将arr1 设置为o,但同样,它们只是保存相同的内存地址。

    总结一下:

    • 你创建了arr
    • 您创建了o 并使其引用与arr 相同,因此它们共享相同的内存。
    • 您创建了arr1 并使其引用与o 相同,arr 也相同。所以,arrarr1o,都有相同的引用。

    对其中任何一个的任何更改都会影响其他人。

    【讨论】:

    • “为什么?因为你改变了它!” ...这无助于向 OP 解释为什么更改第二个数组中的值也会导致第一个数组中的值发生更改。我假设您注意到这是两个不同的数组?
    • @ADyson,我没有注意到其中一个是arr,另一个是arr1,以为只有arro。但是在当前答案的第二部分中解释的相同概念仍然适用于第一部分。但无论如何我都会编辑我的答案。
    • 感谢您的回答。它帮助我理解了代码
    【解决方案2】:

    arr、arr1 和 o 指向同一个数组的同一个内存基地址。

    在 C# 中,数组是通过引用使用的。

    引用是一个隐藏的托管指针,忘记管理它。

    【讨论】:

    • 为了更清楚(我希望)。您创建了一个新数组,并让变量 arr 引用它。然后通过箭头变量将该数组中的第二个元素设置为 10。然后将变量o 设置为引用同一个数组(o 的类型为object 并不重要;object 类型的变量可以引用任何东西)。然后设置变量arr1 来引用同一个数组。此时,arroarr1 都指的是同一个东西,即您创建的那个数组;虽然通过o 访问数组需要将其转换回数组引用。
    • 就是这样。需要强制转换以匹配所引用事物的类型,即数组。
    猜你喜欢
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多