通过分配新数组更改数组值

Changing array values by assigning new array

我有一个布尔数组

private bool[] example =  {false, false};

我使用一个函数更改它们,如果两个值都为真,该函数也 returns 为真。

    private bool checkExample(bool firstCondition, bool secondCondition){
        example = new bool[]{firstCondition, secondCondition};
        return example.All(x => x);
    }

我担心这里的内存。通过分配新数组来更改数组是否安全? new bool[]{firstCondition, secondCondition};

幕后究竟发生了什么?据我了解,由于它在函数内部,我们正在使用短期存储?或者因为我们使用关键字 new 我们正在使用长期存储?

我非常重视你的帮助。

示例用例:

checkExample(example[0], true); // and vice versa

这里发生的事情很简单。首先,您需要意识到所有数组(甚至是值类型的数组(如 bool)都是引用类型的实例。因此,当您说:

private bool[] example =  {false, false};

您正在做的是在 class 中创建一个字段,其中包含对 bool 的单维数组的引用。由于您正在初始化它,因此创建并初始化了数组,在托管堆上创建了一个对象。

在你的方法中,你正在这样做:

example = new bool[]{firstCondition, secondCondition};

在该代码中,您指的是与初始化相同的 example 成员。该代码中发生的事情是在 托管堆 上创建并初始化了一个新的 bool 数组,并且您正在为 example 字段分配对该新数组的引用。

此时,除非您将对该原始数组的引用分配给其他内容(长期变量、字段或 属性),否则原始数组不再有任何引用。一旦托管堆上的对象不再有任何引用,它就会符合垃圾收集条件

在未来的某个时候,垃圾收集器会过来“收集”内存。如果阵列没有存在很长时间,那么它将被收集在 Gen0 集合中(非常便宜)。很有可能,它会被收集到 Gen1 或 Gen2 集合中(每个都花费更多)。

一般来说,您不必担心这样的事情。托管(/垃圾收集)系统期望您的代码会产生垃圾。 .NET 中的分配非常便宜。为了提高垃圾回收(尤其是小对象)的效率,我们付出了很多努力。

如果您出于其他原因不需要创建新数组,为什么不使用它

 private bool checkExample(bool firstCondition, bool secondCondition){
        example[0]=firstCondition; 
        example[1]= secondCondition;
        return example.All(x => x);
    }