我有一个bool数组
private bool[] example = {false, false};我使用一个函数来修改它们,如果这两个值都是真的话,这个函数也会返回true。
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发布于 2022-01-06 01:58:42
这里发生的事情很简单。首先,您需要认识到,所有数组(甚至值类型的数组(如bool)都是引用类型的实例。所以当你说:
private bool[] example = {false, false};您要做的是在类中创建一个字段,该字段包含对bool的单维度数组的引用。由于您正在初始化它,因此将创建和初始化数组,从而在托管堆上创建一个对象。
在您的方法中,您将执行以下操作:
example = new bool[]{firstCondition, secondCondition};在该代码中,您指的是初始化时相同的example成员。在该代码中所发生的事情是,在托管堆上创建一个新的bool数组并进行初始化,您将向example字段分配一个对该新数组的引用。
此时,除非将对原始数组的引用分配给其他东西(长期存在的变量、字段或属性),否则原始数组将不再具有对它的任何引用。一旦托管堆上的对象不再具有对其的任何引用,它就有资格进行垃圾收集。
在将来的某个时候,垃圾收集器会出现并“收集”内存。如果数组没有出现很长时间,那么它将被收集到一个Gen0集合中(这非常便宜)。很可能,它将被收集到一个Gen1或Gen2集合中(每个集合的成本都会更高)。
一般来说,你不需要担心这样的事情。托管(/garbage回收)系统期望您的代码产生垃圾。在.NET中的分配非常便宜。要使垃圾收集(特别是对小型对象)高效,需要付出很大的努力。
发布于 2022-01-06 02:00:48
如果您不需要创建一个新的数组,为什么不使用它呢?
private bool checkExample(bool firstCondition, bool secondCondition){
example[0]=firstCondition;
example[1]= secondCondition;
return example.All(x => x);
}https://stackoverflow.com/questions/70601485
复制相似问题