为什么一个新变量复制我的静态变量,改变我的静态变量?

时间:2013-12-28 04:56:09

标签: c# static sfml

class Graphics

    public static Image[] ImageArray = new Image[16];

在另一个班级,

        //Copy original Array
        tempArray = Graphics.ImageArray;

我正在努力使tempArray成为静态变量的精确副本,不应该更改,但tempArray需要更改。它不是复制静态变量,而是为它添加另一个变量名。

因为如果我更改tempArray,就好像我改变ImageArray一样。 如何通过使ImageArray成为非静态副本来简单地复制tempArray

3 个答案:

答案 0 :(得分:4)

  

为什么一个新变量复制我的静态变量,改变我的静态变量?

简短的回答是,因为它不会复制您的静态变量。它创建对同一静态变量的第二个引用,而不进行复制。这就是为什么通过tempArray变量更改数组相当于通过ImageArray变量更改数组。

  

那么......我该如何复制呢?

这取决于您需要的副本类型:

  • 如果您需要“浅”副本(即复制数组,但内部图像与静态数组中的图像相同),请使用Array.Copy方法
  • 如果您需要“深度”副本,请使用LINQ的ToArray方法,并在Select内制作图像副本。

浅拷贝:

tempArray = new Image[Graphics.ImageArray.Length];
Array.Copy(Graphics.ImageArray, tempArray, Graphics.ImageArray.Length);

深拷贝:

tempArray = Graphics.ImageArray.Select(img => new Image(img)).ToArray();

答案 1 :(得分:1)

考虑使用tempArray = Graphics.ImageArray.Clone()

请注意Clone()创建一个浅层的数组副本,对于深层副本,请使用: tempArray = Graphics.ImageArray.Select(i => i.Clone() as Image).ToArray()

答案 2 :(得分:0)

SFML有自己的参数来复制Image。应该先检查SFML.Image定义。

      //Create Image Array and fill it
        Image[] tempArray = new Image[16];
        for (int z = 0; z < 16; z++)
        {
            tempArray[z] = new Image(Graphics.ImageArray[z]);
        }