【问题标题】:C# Static arrays - assigning values of static array to other static arrayC# 静态数组 - 将静态数组的值分配给其他静态数组
【发布时间】:2015-06-21 16:03:52
【问题描述】:

我需要将静态数组的值分配给另一个静态数组。但是当我这样做时,如果我更改第一个数组,它也会影响另一个数组。那我应该如何分配这些值呢?

我用这个例子简化了我的问题:

class Program
{
    static double[] a1;
    static double[] a2;

    static double b1;
    static double b2;

    static void Main(string[] args)
    {
        //First example
        a1 = new double[5] { 1,2,3,4,5 };
        a2 = new double[5] { 6,7,8,9,10};

        a2 = a1;
        a1[2] = 99;  //I change only a1
        
        Console.WriteLine(a1[2]);        
        Console.WriteLine(a2[2]);
        //Result is:
        // 99
        // 99   why is a2 changed too?       


        //Second example 
        b1 = new double(); 
        b2 = new double(); 
        b1 = 10;
        b2 = 20;

        b2 = b1;
        b1 = 33;

        Console.WriteLine(b1);
        Console.WriteLine(b2);
        //Result is:
        // 33     
        // 10   this is okay
    }
}

那么当我分配a2 = a1时,a2得到a1的地址还是什么?但是为什么像我的第二个示例中的正常变量不会发生这种情况?

【问题讨论】:

标签: c# arrays static


【解决方案1】:

当您分配 a2=a1 时,您执行的是浅拷贝。对 a1 的引用(某种程度上等同于旧指针)被复制到 a2。他们现在指向相同的数据,改变一个数据会改变另一个数据。要创建深层副本,请使用 Clone() 函数,如下所示:

a2 = a1.Clone() as double[];

【讨论】:

    【解决方案2】:

    这是因为静态变量存储在堆上。将 a1 分配给 a2 后,您实际上指向的是相同的内存位置,这就是为什么 a1 和 a2 都会出现一个变化的原因。

    在第二种情况下,这些变量被加载到堆栈中并且是值类型变量。因此,只有值被复制。

    【讨论】:

      【解决方案3】:

      通过分配 a2 = a1,您不会将数组 a1 复制到 a2 中。 a1 和 a2 表示对对象的引用,因此当您使用 a2 = a1 时,您只是在复制引用(因此 a2 和 a1 指的是同一个对象,即数组 { 1,2,3,4,5 }。这就是为什么您在 a2 中看到 a1 中所做的更改(因为它们本质上是相同的)。

      您想要的是逐个元素地复制,如下所示: https://msdn.microsoft.com/pl-pl/library/system.array.copy%28v=vs.110%29.aspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-18
        • 2010-11-27
        • 2013-12-03
        • 2010-10-07
        • 2020-09-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多