为什么复制我的静态变量的新变量会更改我的静态变量?

uFo*_*ll8 1 c# static sfml

class Graphics

    public static Image[] ImageArray = new Image[16];
Run Code Online (Sandbox Code Playgroud)

而在不同的班级里,

        //Copy original Array
        tempArray = Graphics.ImageArray;
Run Code Online (Sandbox Code Playgroud)

我正在尝试制作tempArray静态变量的精确副本,它永远不会改变,但tempArray需要改变。它似乎不是复制静态变量,而是向其中添加另一个变量名。

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

das*_*ght 5

为什么复制我的静态变量的新变量会更改我的静态变量?

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

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

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

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

浅拷贝:

tempArray = new Image[Graphics.ImageArray.Length];
Array.Copy(Graphics.ImageArray, tempArray, Graphics.ImageArray.Length);
Run Code Online (Sandbox Code Playgroud)

深拷贝:

tempArray = Graphics.ImageArray.Select(img => new Image(img)).ToArray();
Run Code Online (Sandbox Code Playgroud)