【问题标题】:Why is a new variable which copies my static variable, changing my static variable?为什么复制我的静态变量的新变量会更改我的静态变量?
【发布时间】:2014-01-15 15:55:39
【问题描述】:
class Graphics

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

在不同的班级,

        //Copy original Array
        tempArray = Graphics.ImageArray;

我正在尝试使 tempArray 成为静态变量的精确副本,它永远不会更改,但 tempArray 需要更改。与其复制静态变量,不如为其添加另一个变量名。

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

【问题讨论】:

    标签: c# static sfml


    【解决方案1】:

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

    简短的回答是,因为它不会复制您的静态变量。它创建对同一静态变量的第二个引用,而不进行复制。这就是为什么通过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();
    

    【讨论】:

      【解决方案2】:

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

      注意Clone() 创建了一个数组的浅拷贝,对于深拷贝使用这个: tempArray = Graphics.ImageArray.Select(i => i.Clone() as Image).ToArray()

      【讨论】:

        【解决方案3】:

        SFML 有自己的参数来复制图像。应该先检查 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]);
                }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-03-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-28
          • 1970-01-01
          相关资源
          最近更新 更多